adding zend project folders into old campcaster.
This commit is contained in:
parent
56abfaf28e
commit
7ef0c18b26
59
application/Bootstrap.php
Normal file
59
application/Bootstrap.php
Normal file
@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
Zend_Session::start();
|
||||
|
||||
require_once (__DIR__."/configs/navigation.php");
|
||||
require_once (__DIR__."/configs/ACL.php");
|
||||
|
||||
require_once 'propel/runtime/lib/Propel.php';
|
||||
Propel::init(__DIR__."/configs/propel-config.php");
|
||||
|
||||
//DateTime in PHP 5.3.0+ need a default timezone set.
|
||||
$tz = ini_get('date.timezone') ? ini_get('date.timezone') : 'America/Toronto';
|
||||
date_default_timezone_set($tz);
|
||||
|
||||
require_once (__DIR__."/configs/constants.php");
|
||||
require_once (__DIR__."/configs/conf.php");
|
||||
require_once 'DB.php';
|
||||
|
||||
require_once 'Playlist.php';
|
||||
require_once 'StoredFile.php';
|
||||
require_once 'Schedule.php';
|
||||
require_once 'Shows.php';
|
||||
require_once 'Users.php';
|
||||
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$dsn = $CC_CONFIG['dsn'];
|
||||
|
||||
$CC_DBC = DB::connect($dsn, TRUE);
|
||||
if (PEAR::isError($CC_DBC)) {
|
||||
echo "ERROR: ".$CC_DBC->getMessage()." ".$CC_DBC->getUserInfo()."\n";
|
||||
exit(1);
|
||||
}
|
||||
$CC_DBC->setFetchMode(DB_FETCHMODE_ASSOC);
|
||||
|
||||
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
|
||||
{
|
||||
protected function _initDoctype()
|
||||
{
|
||||
$this->bootstrap('view');
|
||||
$view = $this->getResource('view');
|
||||
$view->doctype('XHTML1_STRICT');
|
||||
}
|
||||
|
||||
protected function _initHeadLink()
|
||||
{
|
||||
$view = $this->getResource('view');
|
||||
|
||||
$view->headLink()->appendStylesheet('/css/excite-bike/excite_bike.css');
|
||||
}
|
||||
|
||||
protected function _initHeadScript()
|
||||
{
|
||||
$view = $this->getResource('view');
|
||||
$view->headScript()->appendFile('/js/libs/jquery-1.4.4.min.js','text/javascript');
|
||||
$view->headScript()->appendFile('/js/libs/jquery-ui-1.8.5.min.js','text/javascript');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
33
application/configs/ACL.php
Normal file
33
application/configs/ACL.php
Normal file
@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
require_once 'Acl_plugin.php';
|
||||
|
||||
$ccAcl = new Zend_Acl();
|
||||
|
||||
$ccAcl->addRole(new Zend_Acl_Role('guest'))
|
||||
->addRole(new Zend_Acl_Role('host'), 'guest')
|
||||
->addRole(new Zend_Acl_Role('admin'), 'host');
|
||||
|
||||
$ccAcl->add(new Zend_Acl_Resource('library'))
|
||||
->add(new Zend_Acl_Resource('index'))
|
||||
->add(new Zend_Acl_Resource('error'))
|
||||
->add(new Zend_Acl_Resource('login'))
|
||||
->add(new Zend_Acl_Resource('playlist'))
|
||||
->add(new Zend_Acl_Resource('plupload'))
|
||||
->add(new Zend_Acl_Resource('schedule'))
|
||||
->add(new Zend_Acl_Resource('search'));
|
||||
|
||||
/** Creating permissions */
|
||||
$ccAcl->allow('guest', 'index')
|
||||
->allow('guest', 'login')
|
||||
->allow('guest', 'error')
|
||||
->allow('guest', 'library')
|
||||
->allow('guest', 'search')
|
||||
->allow('host', 'plupload')
|
||||
->allow('host', 'playlist')
|
||||
->allow('host', 'schedule');
|
||||
|
||||
$aclPlugin = new Zend_Controller_Plugin_Acl($ccAcl);
|
||||
|
||||
$front = Zend_Controller_Front::getInstance();
|
||||
$front->registerPlugin($aclPlugin);
|
||||
28
application/configs/application.ini
Normal file
28
application/configs/application.ini
Normal file
@ -0,0 +1,28 @@
|
||||
[production]
|
||||
phpSettings.display_startup_errors = 0
|
||||
phpSettings.display_errors = 0
|
||||
includePaths.library = APPLICATION_PATH "/../library"
|
||||
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
|
||||
bootstrap.class = "Bootstrap"
|
||||
appnamespace = "Application"
|
||||
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
|
||||
resources.frontController.params.displayExceptions = 0
|
||||
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 = "campcaster"
|
||||
resources.db.params.password = "campcaster"
|
||||
resources.db.params.dbname = "campcaster"
|
||||
|
||||
[staging : production]
|
||||
|
||||
[testing : production]
|
||||
phpSettings.display_startup_errors = 1
|
||||
phpSettings.display_errors = 1
|
||||
|
||||
[development : production]
|
||||
phpSettings.display_startup_errors = 1
|
||||
phpSettings.display_errors = 1
|
||||
resources.frontController.params.displayExceptions = 1
|
||||
95
application/configs/classmap-propel-config.php
Normal file
95
application/configs/classmap-propel-config.php
Normal file
@ -0,0 +1,95 @@
|
||||
<?php
|
||||
// This file generated by Propel 1.5.2 convert-conf target
|
||||
return array (
|
||||
'CcAccessTableMap' => 'campcaster/map/CcAccessTableMap.php',
|
||||
'CcAccessPeer' => 'campcaster/CcAccessPeer.php',
|
||||
'CcAccess' => 'campcaster/CcAccess.php',
|
||||
'CcAccessQuery' => 'campcaster/CcAccessQuery.php',
|
||||
'BaseCcAccessPeer' => 'campcaster/om/BaseCcAccessPeer.php',
|
||||
'BaseCcAccess' => 'campcaster/om/BaseCcAccess.php',
|
||||
'BaseCcAccessQuery' => 'campcaster/om/BaseCcAccessQuery.php',
|
||||
'CcBackupTableMap' => 'campcaster/map/CcBackupTableMap.php',
|
||||
'CcBackupPeer' => 'campcaster/CcBackupPeer.php',
|
||||
'CcBackup' => 'campcaster/CcBackup.php',
|
||||
'CcBackupQuery' => 'campcaster/CcBackupQuery.php',
|
||||
'BaseCcBackupPeer' => 'campcaster/om/BaseCcBackupPeer.php',
|
||||
'BaseCcBackup' => 'campcaster/om/BaseCcBackup.php',
|
||||
'BaseCcBackupQuery' => 'campcaster/om/BaseCcBackupQuery.php',
|
||||
'CcFilesTableMap' => 'campcaster/map/CcFilesTableMap.php',
|
||||
'CcFilesPeer' => 'campcaster/CcFilesPeer.php',
|
||||
'CcFiles' => 'campcaster/CcFiles.php',
|
||||
'CcFilesQuery' => 'campcaster/CcFilesQuery.php',
|
||||
'BaseCcFilesPeer' => 'campcaster/om/BaseCcFilesPeer.php',
|
||||
'BaseCcFiles' => 'campcaster/om/BaseCcFiles.php',
|
||||
'BaseCcFilesQuery' => 'campcaster/om/BaseCcFilesQuery.php',
|
||||
'CcPermsTableMap' => 'campcaster/map/CcPermsTableMap.php',
|
||||
'CcPermsPeer' => 'campcaster/CcPermsPeer.php',
|
||||
'CcPerms' => 'campcaster/CcPerms.php',
|
||||
'CcPermsQuery' => 'campcaster/CcPermsQuery.php',
|
||||
'BaseCcPermsPeer' => 'campcaster/om/BaseCcPermsPeer.php',
|
||||
'BaseCcPerms' => 'campcaster/om/BaseCcPerms.php',
|
||||
'BaseCcPermsQuery' => 'campcaster/om/BaseCcPermsQuery.php',
|
||||
'CcShowTableMap' => 'campcaster/map/CcShowTableMap.php',
|
||||
'CcShowPeer' => 'campcaster/CcShowPeer.php',
|
||||
'CcShow' => 'campcaster/CcShow.php',
|
||||
'CcShowQuery' => 'campcaster/CcShowQuery.php',
|
||||
'BaseCcShowPeer' => 'campcaster/om/BaseCcShowPeer.php',
|
||||
'BaseCcShow' => 'campcaster/om/BaseCcShow.php',
|
||||
'BaseCcShowQuery' => 'campcaster/om/BaseCcShowQuery.php',
|
||||
'CcPlaylistTableMap' => 'campcaster/map/CcPlaylistTableMap.php',
|
||||
'CcPlaylistPeer' => 'campcaster/CcPlaylistPeer.php',
|
||||
'CcPlaylist' => 'campcaster/CcPlaylist.php',
|
||||
'CcPlaylistQuery' => 'campcaster/CcPlaylistQuery.php',
|
||||
'BaseCcPlaylistPeer' => 'campcaster/om/BaseCcPlaylistPeer.php',
|
||||
'BaseCcPlaylist' => 'campcaster/om/BaseCcPlaylist.php',
|
||||
'BaseCcPlaylistQuery' => 'campcaster/om/BaseCcPlaylistQuery.php',
|
||||
'CcPlaylistcontentsTableMap' => 'campcaster/map/CcPlaylistcontentsTableMap.php',
|
||||
'CcPlaylistcontentsPeer' => 'campcaster/CcPlaylistcontentsPeer.php',
|
||||
'CcPlaylistcontents' => 'campcaster/CcPlaylistcontents.php',
|
||||
'CcPlaylistcontentsQuery' => 'campcaster/CcPlaylistcontentsQuery.php',
|
||||
'BaseCcPlaylistcontentsPeer' => 'campcaster/om/BaseCcPlaylistcontentsPeer.php',
|
||||
'BaseCcPlaylistcontents' => 'campcaster/om/BaseCcPlaylistcontents.php',
|
||||
'BaseCcPlaylistcontentsQuery' => 'campcaster/om/BaseCcPlaylistcontentsQuery.php',
|
||||
'CcPrefTableMap' => 'campcaster/map/CcPrefTableMap.php',
|
||||
'CcPrefPeer' => 'campcaster/CcPrefPeer.php',
|
||||
'CcPref' => 'campcaster/CcPref.php',
|
||||
'CcPrefQuery' => 'campcaster/CcPrefQuery.php',
|
||||
'BaseCcPrefPeer' => 'campcaster/om/BaseCcPrefPeer.php',
|
||||
'BaseCcPref' => 'campcaster/om/BaseCcPref.php',
|
||||
'BaseCcPrefQuery' => 'campcaster/om/BaseCcPrefQuery.php',
|
||||
'CcScheduleTableMap' => 'campcaster/map/CcScheduleTableMap.php',
|
||||
'CcSchedulePeer' => 'campcaster/CcSchedulePeer.php',
|
||||
'CcSchedule' => 'campcaster/CcSchedule.php',
|
||||
'CcScheduleQuery' => 'campcaster/CcScheduleQuery.php',
|
||||
'BaseCcSchedulePeer' => 'campcaster/om/BaseCcSchedulePeer.php',
|
||||
'BaseCcSchedule' => 'campcaster/om/BaseCcSchedule.php',
|
||||
'BaseCcScheduleQuery' => 'campcaster/om/BaseCcScheduleQuery.php',
|
||||
'CcSessTableMap' => 'campcaster/map/CcSessTableMap.php',
|
||||
'CcSessPeer' => 'campcaster/CcSessPeer.php',
|
||||
'CcSess' => 'campcaster/CcSess.php',
|
||||
'CcSessQuery' => 'campcaster/CcSessQuery.php',
|
||||
'BaseCcSessPeer' => 'campcaster/om/BaseCcSessPeer.php',
|
||||
'BaseCcSess' => 'campcaster/om/BaseCcSess.php',
|
||||
'BaseCcSessQuery' => 'campcaster/om/BaseCcSessQuery.php',
|
||||
'CcSmembTableMap' => 'campcaster/map/CcSmembTableMap.php',
|
||||
'CcSmembPeer' => 'campcaster/CcSmembPeer.php',
|
||||
'CcSmemb' => 'campcaster/CcSmemb.php',
|
||||
'CcSmembQuery' => 'campcaster/CcSmembQuery.php',
|
||||
'BaseCcSmembPeer' => 'campcaster/om/BaseCcSmembPeer.php',
|
||||
'BaseCcSmemb' => 'campcaster/om/BaseCcSmemb.php',
|
||||
'BaseCcSmembQuery' => 'campcaster/om/BaseCcSmembQuery.php',
|
||||
'CcSubjsTableMap' => 'campcaster/map/CcSubjsTableMap.php',
|
||||
'CcSubjsPeer' => 'campcaster/CcSubjsPeer.php',
|
||||
'CcSubjs' => 'campcaster/CcSubjs.php',
|
||||
'CcSubjsQuery' => 'campcaster/CcSubjsQuery.php',
|
||||
'BaseCcSubjsPeer' => 'campcaster/om/BaseCcSubjsPeer.php',
|
||||
'BaseCcSubjs' => 'campcaster/om/BaseCcSubjs.php',
|
||||
'BaseCcSubjsQuery' => 'campcaster/om/BaseCcSubjsQuery.php',
|
||||
'CcTransTableMap' => 'campcaster/map/CcTransTableMap.php',
|
||||
'CcTransPeer' => 'campcaster/CcTransPeer.php',
|
||||
'CcTrans' => 'campcaster/CcTrans.php',
|
||||
'CcTransQuery' => 'campcaster/CcTransQuery.php',
|
||||
'BaseCcTransPeer' => 'campcaster/om/BaseCcTransPeer.php',
|
||||
'BaseCcTrans' => 'campcaster/om/BaseCcTrans.php',
|
||||
'BaseCcTransQuery' => 'campcaster/om/BaseCcTransQuery.php',
|
||||
);
|
||||
193
application/configs/conf.php
Normal file
193
application/configs/conf.php
Normal file
@ -0,0 +1,193 @@
|
||||
<?php
|
||||
define('CAMPCASTER_VERSION', '1.6.0-alpha');
|
||||
define('CAMPCASTER_COPYRIGHT_DATE', '2010');
|
||||
|
||||
// These are the default values for the config.
|
||||
global $CC_CONFIG;
|
||||
|
||||
$CC_CONFIG = array(
|
||||
// Database config
|
||||
'dsn' => array(
|
||||
'username' => 'campcaster',
|
||||
'password' => 'campcaster',
|
||||
'hostspec' => 'localhost',
|
||||
'phptype' => 'pgsql',
|
||||
'database' => 'campcaster',
|
||||
),
|
||||
|
||||
// Name of the web server user
|
||||
'webServerUser' => 'www-data',
|
||||
|
||||
// prefix for table names in the database
|
||||
'tblNamePrefix' => 'cc_',
|
||||
|
||||
/* ================================================ storage configuration */
|
||||
|
||||
'apiKey' => array('AAA'),
|
||||
|
||||
// main directory for storing binary media files
|
||||
'storageDir' => dirname(__FILE__).'/../../stor',
|
||||
|
||||
// directory for temporary files
|
||||
'bufferDir' => dirname(__FILE__).'/../../stor/buffer',
|
||||
|
||||
// directory for incomplete transferred files
|
||||
'transDir' => dirname(__FILE__).'/trans',
|
||||
|
||||
// directory for symlinks to accessed files
|
||||
'accessDir' => dirname(__FILE__).'/access',
|
||||
'cronDir' => dirname(__FILE__).'/backend/cron',
|
||||
|
||||
"rootDir" => dirname(__FILE__),
|
||||
"smartyTemplate" => dirname(__FILE__)."/htmlUI/templates",
|
||||
"smartyTemplateCompiled" => dirname(__FILE__)."/htmlUI/templates_c",
|
||||
'pearPath' => dirname(__FILE__).'/3rd_party/php/pear',
|
||||
'zendPath' => dirname(__FILE__).'/3rd_party/php/Zend',
|
||||
'phingPath' => dirname(__FILE__).'/3rd_party/php/phing',
|
||||
'LogPath' => dirname(__FILE__).'/3rd_party/php/Log',
|
||||
|
||||
// secret token cookie name
|
||||
'authCookieName'=> 'campcaster_session_id',
|
||||
|
||||
// name of admin group
|
||||
//'AdminsGr' => 'Admins',
|
||||
|
||||
// name of station preferences group
|
||||
'StationPrefsGr'=> 'StationPrefs',
|
||||
|
||||
// name of 'all users' group
|
||||
//'AllGr' => 'All',
|
||||
'TrashName' => 'trash_',
|
||||
|
||||
// enable/disable validator
|
||||
'validate' => TRUE,
|
||||
|
||||
// enable/disable safe delete (move to trash)
|
||||
'useTrash' => FALSE,
|
||||
|
||||
/* ==================================================== URL configuration */
|
||||
// path-URL-part of storageServer base dir
|
||||
'storageUrlPath' => '/campcaster/backend',
|
||||
|
||||
// XMLRPC server script address relative to storageUrlPath
|
||||
'storageXMLRPC' => 'xmlrpc/xrLocStor.php',
|
||||
|
||||
// host and port of storageServer
|
||||
'storageUrlHost' => 'localhost',
|
||||
'storageUrlPort' => 80,
|
||||
|
||||
/* ================================================ remote link configuration */
|
||||
// path-URL-part of remote server base dir
|
||||
'archiveUrlPath' => '/campcaster/backend',
|
||||
|
||||
// XMLRPC server script address relative to archiveUrlPath
|
||||
'archiveXMLRPC' => 'xmlrpc/xrLocStor.php',
|
||||
|
||||
// host and port of archiveServer
|
||||
'archiveUrlHost' => 'localhost',
|
||||
// 'archiveUrlHost' => '192.168.30.166',
|
||||
'archiveUrlPort' => 80,
|
||||
|
||||
// account info for login to archive
|
||||
'archiveAccountLogin' => 'root',
|
||||
'archiveAccountPass' => 'q',
|
||||
|
||||
/* ============================================== scheduler configuration */
|
||||
'schedulerUrlPath' => '',
|
||||
'schedulerXMLRPC' => 'RC2',
|
||||
'schedulerUrlHost' => 'localhost',
|
||||
'schedulerUrlPort' => 3344,
|
||||
'schedulerPass' => 'change_me',
|
||||
|
||||
/* ==================================== application-specific configuration */
|
||||
'objtypes' => array(
|
||||
'Storage' => array(/*'Folder',*/ 'File' /*, 'Replica'*/),
|
||||
'File' => array(),
|
||||
'audioclip' => array(),
|
||||
'playlist' => array(),
|
||||
// 'Replica' => array(),
|
||||
),
|
||||
'allowedActions'=> array(
|
||||
'File' => array('editPrivs', 'write', 'read'),
|
||||
'audioclip' => array('editPrivs', 'write', 'read'),
|
||||
'playlist' => array('editPrivs', 'write', 'read'),
|
||||
// 'Replica' => array('editPrivs', 'write', 'read'),
|
||||
// '_class' => array('editPrivs', 'write', 'read'),
|
||||
),
|
||||
'allActions' => array(
|
||||
'editPrivs', 'write', 'read', /*'classes',*/ 'subjects'
|
||||
),
|
||||
|
||||
/* ============================================== auxiliary configuration */
|
||||
'tmpRootPass' => 'q',
|
||||
|
||||
/* =================================================== cron configuration */
|
||||
'cronUserName' => 'www-data',
|
||||
# 'lockfile' => dirname(__FILE__).'/cron/cron.lock',
|
||||
'lockfile' => dirname(__FILE__).'/stor/buffer/cron.lock',
|
||||
'cronfile' => dirname(__FILE__).'/cron/croncall.php',
|
||||
'paramdir' => dirname(__FILE__).'/cron/params',
|
||||
'systemPrefId' => "0", // ID for system prefs in prefs table
|
||||
);
|
||||
|
||||
// Add database table names
|
||||
$CC_CONFIG['playListTable'] = $CC_CONFIG['tblNamePrefix'].'playlist';
|
||||
$CC_CONFIG['playListContentsTable'] = $CC_CONFIG['tblNamePrefix'].'playlistcontents';
|
||||
$CC_CONFIG['filesTable'] = $CC_CONFIG['tblNamePrefix'].'files';
|
||||
$CC_CONFIG['accessTable'] = $CC_CONFIG['tblNamePrefix'].'access';
|
||||
$CC_CONFIG['permTable'] = $CC_CONFIG['tblNamePrefix'].'perms';
|
||||
$CC_CONFIG['sessTable'] = $CC_CONFIG['tblNamePrefix'].'sess';
|
||||
$CC_CONFIG['subjTable'] = $CC_CONFIG['tblNamePrefix'].'subjs';
|
||||
$CC_CONFIG['smembTable'] = $CC_CONFIG['tblNamePrefix'].'smemb';
|
||||
$CC_CONFIG['transTable'] = $CC_CONFIG['tblNamePrefix'].'trans';
|
||||
$CC_CONFIG['prefTable'] = $CC_CONFIG['tblNamePrefix'].'pref';
|
||||
$CC_CONFIG['scheduleTable'] = $CC_CONFIG['tblNamePrefix'].'schedule';
|
||||
$CC_CONFIG['backupTable'] = $CC_CONFIG['tblNamePrefix'].'backup';
|
||||
$CC_CONFIG['playListTimeView'] = $CC_CONFIG['tblNamePrefix'].'playlisttimes';
|
||||
|
||||
$CC_CONFIG['playListSequence'] = $CC_CONFIG['playListTable'].'_id';
|
||||
$CC_CONFIG['filesSequence'] = $CC_CONFIG['filesTable'].'_id';
|
||||
$CC_CONFIG['transSequence'] = $CC_CONFIG['transTable'].'_id';
|
||||
$CC_CONFIG['prefSequence'] = $CC_CONFIG['prefTable'].'_id';
|
||||
$CC_CONFIG['permSequence'] = $CC_CONFIG['permTable'].'_id';
|
||||
$CC_CONFIG['subjSequence'] = $CC_CONFIG['subjTable'].'_id';
|
||||
$CC_CONFIG['smembSequence'] = $CC_CONFIG['smembTable'].'_id';
|
||||
|
||||
// System users/groups - they cannot be deleted
|
||||
$CC_CONFIG['sysSubjs'] = array(
|
||||
'root', /*$CC_CONFIG['AdminsGr'],*/ /*$CC_CONFIG['AllGr'],*/ $CC_CONFIG['StationPrefsGr']
|
||||
);
|
||||
|
||||
// Add libs to the PHP path
|
||||
$old_include_path = get_include_path();
|
||||
set_include_path('.'.PATH_SEPARATOR.$CC_CONFIG['pearPath']
|
||||
.PATH_SEPARATOR.$CC_CONFIG['zendPath']
|
||||
.PATH_SEPARATOR.$old_include_path);
|
||||
|
||||
// Check that all the required directories exist.
|
||||
//foreach (array('storageDir', 'bufferDir', 'transDir', 'accessDir', 'cronDir') as $d) {
|
||||
// $test = file_exists($CC_CONFIG[$d]);
|
||||
// if ( $test === FALSE ) {
|
||||
// echo " * Error: directory {$CC_CONFIG[$d]} is missing.\n";
|
||||
// echo " * Please run the install script again.\n";
|
||||
// exit(1);
|
||||
// } else {
|
||||
// $rp = realpath($CC_CONFIG[$d]);
|
||||
// }
|
||||
// $CC_CONFIG[$d] = $rp;
|
||||
//}
|
||||
|
||||
// Check that htmlUI/templates_c has the right permissions
|
||||
//$ss=@stat($CC_CONFIG["smartyTemplateCompiled"]);
|
||||
//$groupOwner = (function_exists('posix_getgrgid'))?@posix_getgrgid($ss['gid']):'';
|
||||
//if (!empty($groupOwner) && ($groupOwner["name"] != $CC_CONFIG["webServerUser"])) {
|
||||
// echo " * Error: Your directory permissions for {$CC_CONFIG['smartyTemplateCompiled']} are not set correctly.<br>\n";
|
||||
// echo " * The group perms need to be set to the web server user, in this case '{$CC_CONFIG['webServerUser']}'.<br>\n";
|
||||
// exit(1);
|
||||
//}
|
||||
//$fileperms=@fileperms($CC_CONFIG["smartyTemplateCompiled"]);
|
||||
//if (!($fileperms & 0x0400)) {
|
||||
// echo " * Error: Sticky bit not set for {$CC_CONFIG['smartyTemplateCompiled']}.<br>\n";
|
||||
// exit(1);
|
||||
//}
|
||||
?>
|
||||
22
application/configs/constants.php
Normal file
22
application/configs/constants.php
Normal file
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
// Metadata Keys
|
||||
define('UI_MDATA_KEY_TITLE', 'dc:title');
|
||||
define('UI_MDATA_KEY_CREATOR', 'dc:creator');
|
||||
define('UI_MDATA_KEY_SOURCE', 'dc:source');
|
||||
define('UI_MDATA_KEY_DURATION', 'dcterms:extent');
|
||||
define('UI_MDATA_KEY_URL', 'ls:url');
|
||||
define('UI_MDATA_KEY_FORMAT', 'dc:format');
|
||||
define('UI_MDATA_KEY_DESCRIPTION', 'dc:description');
|
||||
define('UI_MDATA_KEY_CHANNELS', 'ls:channels');
|
||||
define('UI_MDATA_KEY_SAMPLERATE', 'ls:samplerate');
|
||||
define('UI_MDATA_KEY_BITRATE', 'ls:bitrate');
|
||||
define('UI_MDATA_KEY_ENCODER', 'ls:encoder');
|
||||
define('UI_MDATA_KEY_FILENAME', 'ls:filename');
|
||||
|
||||
define('UI_MDATA_VALUE_FORMAT_FILE', 'File');
|
||||
define('UI_MDATA_VALUE_FORMAT_STREAM', 'live stream');
|
||||
|
||||
// Session Keys
|
||||
define('UI_PLAYLIST_SESSNAME', 'PLAYLIST');
|
||||
|
||||
72
application/configs/navigation.php
Normal file
72
application/configs/navigation.php
Normal file
@ -0,0 +1,72 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* Navigation container (config/array)
|
||||
|
||||
* Each element in the array will be passed to
|
||||
* Zend_Navigation_Page::factory() when constructing
|
||||
* the navigation container below.
|
||||
*/
|
||||
$pages = array(
|
||||
array(
|
||||
'label' => 'Home',
|
||||
'title' => 'Go Home',
|
||||
'module' => 'default',
|
||||
'controller' => 'index',
|
||||
'action' => 'index',
|
||||
'order' => -100 // make sure home is the first page
|
||||
),
|
||||
array(
|
||||
'label' => 'Playlists',
|
||||
'module' => 'default',
|
||||
'controller' => 'Playlist',
|
||||
'action' => 'index',
|
||||
'pages' => array(
|
||||
array(
|
||||
'label' => 'Edit',
|
||||
'module' => 'default',
|
||||
'controller' => 'Playlist',
|
||||
'action' => 'edit',
|
||||
'visible' => false
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'label' => 'Media Library',
|
||||
'module' => 'default',
|
||||
'controller' => 'Library',
|
||||
'action' => 'index',
|
||||
'pages' => array(
|
||||
array(
|
||||
'label' => 'Add Audio',
|
||||
'module' => 'default',
|
||||
'controller' => 'Plupload',
|
||||
'action' => 'plupload'
|
||||
),
|
||||
array(
|
||||
'label' => 'Search',
|
||||
'module' => 'default',
|
||||
'controller' => 'Search',
|
||||
'action' => 'display'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'label' => 'Schedule',
|
||||
'module' => 'default',
|
||||
'controller' => 'Schedule',
|
||||
'action' => 'index'
|
||||
),
|
||||
array(
|
||||
'label' => 'Logout',
|
||||
'module' => 'default',
|
||||
'controller' => 'Login',
|
||||
'action' => 'logout'
|
||||
)
|
||||
);
|
||||
|
||||
// Create container from array
|
||||
$container = new Zend_Navigation($pages);
|
||||
|
||||
//store it in the registry:
|
||||
Zend_Registry::set('Zend_Navigation', $container);
|
||||
20
application/configs/propel-config.php
Normal file
20
application/configs/propel-config.php
Normal file
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
// This file generated by Propel 1.5.2 convert-conf target
|
||||
// from XML runtime conf file /home/naomiaro/campcaster-refactor/campcaster/build/runtime-conf.xml
|
||||
$conf = array (
|
||||
'datasources' =>
|
||||
array (
|
||||
'campcaster' =>
|
||||
array (
|
||||
'adapter' => 'pgsql',
|
||||
'connection' =>
|
||||
array (
|
||||
'dsn' => 'pgsql:host=localhost;port=5432;dbname=campcaster;user=campcaster;password=campcaster',
|
||||
),
|
||||
),
|
||||
'default' => 'campcaster',
|
||||
),
|
||||
'generator_version' => '1.5.2',
|
||||
);
|
||||
$conf['classmap'] = include(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'classmap-propel-config.php');
|
||||
return $conf;
|
||||
58
application/controllers/ErrorController.php
Normal file
58
application/controllers/ErrorController.php
Normal file
@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
class ErrorController extends Zend_Controller_Action
|
||||
{
|
||||
|
||||
public function errorAction()
|
||||
{
|
||||
$errors = $this->_getParam('error_handler');
|
||||
|
||||
switch ($errors->type) {
|
||||
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
|
||||
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
|
||||
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
|
||||
|
||||
// 404 error -- controller or action not found
|
||||
$this->getResponse()->setHttpResponseCode(404);
|
||||
$this->view->message = 'Page not found';
|
||||
break;
|
||||
default:
|
||||
// application error
|
||||
$this->getResponse()->setHttpResponseCode(500);
|
||||
$this->view->message = 'Application error';
|
||||
break;
|
||||
}
|
||||
|
||||
// Log exception, if logger available
|
||||
if ($log = $this->getLog()) {
|
||||
$log->crit($this->view->message, $errors->exception);
|
||||
}
|
||||
|
||||
// conditionally display exceptions
|
||||
if ($this->getInvokeArg('displayExceptions') == true) {
|
||||
$this->view->exception = $errors->exception;
|
||||
}
|
||||
|
||||
$this->view->request = $errors->request;
|
||||
}
|
||||
|
||||
public function getLog()
|
||||
{
|
||||
$bootstrap = $this->getInvokeArg('bootstrap');
|
||||
if (!$bootstrap->hasPluginResource('Log')) {
|
||||
return false;
|
||||
}
|
||||
$log = $bootstrap->getResource('Log');
|
||||
return $log;
|
||||
}
|
||||
|
||||
public function deniedAction()
|
||||
{
|
||||
// action body
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
39
application/controllers/IndexController.php
Normal file
39
application/controllers/IndexController.php
Normal file
@ -0,0 +1,39 @@
|
||||
<?php
|
||||
|
||||
class IndexController extends Zend_Controller_Action
|
||||
{
|
||||
|
||||
public function init()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public function indexAction()
|
||||
{
|
||||
$this->_forward('index', 'login');
|
||||
}
|
||||
|
||||
public function mainAction()
|
||||
{
|
||||
$this->_helper->layout->setLayout('layout');
|
||||
}
|
||||
|
||||
public function newfieldAction()
|
||||
{
|
||||
// action body
|
||||
}
|
||||
|
||||
public function displayAction()
|
||||
{
|
||||
// action body
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
104
application/controllers/LibraryController.php
Normal file
104
application/controllers/LibraryController.php
Normal file
@ -0,0 +1,104 @@
|
||||
<?php
|
||||
|
||||
class LibraryController extends Zend_Controller_Action
|
||||
{
|
||||
|
||||
protected $pl_sess = null;
|
||||
|
||||
public function init()
|
||||
{
|
||||
if(!Zend_Auth::getInstance()->hasIdentity())
|
||||
{
|
||||
$this->_redirect('login/index');
|
||||
}
|
||||
|
||||
$ajaxContext = $this->_helper->getHelper('AjaxContext');
|
||||
$ajaxContext->addActionContext('contents', 'html')
|
||||
->addActionContext('plupload', 'html')
|
||||
->addActionContext('upload', 'json')
|
||||
->addActionContext('delete', 'json')
|
||||
->initContext();
|
||||
|
||||
$this->pl_sess = new Zend_Session_Namespace(UI_PLAYLIST_SESSNAME);
|
||||
}
|
||||
|
||||
public function indexAction()
|
||||
{
|
||||
$this->view->headScript()->appendFile('/js/contextmenu/jquery.contextMenu.js','text/javascript');
|
||||
$this->view->headScript()->appendFile('/js/campcaster/library/library.js','text/javascript');
|
||||
|
||||
$this->view->headLink()->appendStylesheet('/css/jquery.contextMenu.css');
|
||||
|
||||
$this->_helper->actionStack('context-menu', 'library');
|
||||
}
|
||||
|
||||
public function contextMenuAction()
|
||||
{
|
||||
$pl_sess = $this->pl_sess;
|
||||
$contextMenu;
|
||||
|
||||
$contextMenu[] = array('action' => '/Library/delete', 'text' => 'Delete');
|
||||
|
||||
if(isset($pl_sess->id))
|
||||
$contextMenu[] = array('action' => '/Playlist/add-item', 'text' => 'Add To Playlist');
|
||||
|
||||
$this->view->menu = $contextMenu;
|
||||
|
||||
$this->_helper->actionStack('contents', 'library');
|
||||
}
|
||||
|
||||
public function deleteAction()
|
||||
{
|
||||
$id = $this->_getParam('id');
|
||||
|
||||
if (!is_null($id)) {
|
||||
$file = StoredFile::Recall($id);
|
||||
|
||||
if (PEAR::isError($file)) {
|
||||
die('{"jsonrpc" : "2.0", "error" : {"message": ' + $file->getMessage() + '}}');
|
||||
}
|
||||
else if(is_null($file)) {
|
||||
die('{"jsonrpc" : "2.0", "error" : {"message": "file doesn\'t exist"}}');
|
||||
}
|
||||
|
||||
$res = $file->delete();
|
||||
|
||||
if (PEAR::isError($res)) {
|
||||
die('{"jsonrpc" : "2.0", "error" : {"message": ' + $res->getMessage() + '}}');
|
||||
}
|
||||
}
|
||||
else {
|
||||
die('{"jsonrpc" : "2.0", "error" : {"message": "file doesn\'t exist"}}');
|
||||
}
|
||||
|
||||
die('{"jsonrpc" : "2.0"}');
|
||||
}
|
||||
|
||||
public function contentsAction()
|
||||
{
|
||||
$query["category"] = $this->_getParam('ob', "dc:creator");
|
||||
$query["order"] = $this->_getParam('order', "asc");
|
||||
|
||||
$this->view->files = StoredFile::getFiles($query);
|
||||
}
|
||||
|
||||
public function searchAction()
|
||||
{
|
||||
// action body
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
96
application/controllers/LoginController.php
Normal file
96
application/controllers/LoginController.php
Normal file
@ -0,0 +1,96 @@
|
||||
<?php
|
||||
|
||||
class LoginController extends Zend_Controller_Action
|
||||
{
|
||||
|
||||
public function init()
|
||||
{
|
||||
/* Initialize action controller here */
|
||||
}
|
||||
|
||||
public function indexAction()
|
||||
{
|
||||
if(Zend_Auth::getInstance()->hasIdentity())
|
||||
{
|
||||
$this->_redirect('library/index');
|
||||
}
|
||||
|
||||
//uses separate layout without a navigation.
|
||||
$this->_helper->layout->setLayout('login');
|
||||
|
||||
$request = $this->getRequest();
|
||||
$form = new Application_Form_Login();
|
||||
|
||||
$errorMessage = "";
|
||||
|
||||
if($request->isPost())
|
||||
{
|
||||
if($form->isValid($request->getPost()))
|
||||
{
|
||||
|
||||
$authAdapter = $this->getAuthAdapter();
|
||||
|
||||
# get the username and password from the form
|
||||
$username = $form->getValue('username');
|
||||
$password = $form->getValue('password');
|
||||
|
||||
# pass to the adapter the submitted username and password
|
||||
$authAdapter->setIdentity($username)
|
||||
->setCredential($password);
|
||||
|
||||
$auth = Zend_Auth::getInstance();
|
||||
$result = $auth->authenticate($authAdapter);
|
||||
|
||||
# is the user a valid one?
|
||||
if($result->isValid())
|
||||
{
|
||||
# all info about this user from the login table
|
||||
# omit only the password, we don't need that
|
||||
$userInfo = $authAdapter->getResultRowObject(null, 'password');
|
||||
|
||||
# the default storage is a session with namespace Zend_Auth
|
||||
$authStorage = $auth->getStorage();
|
||||
$authStorage->write($userInfo);
|
||||
|
||||
$this->_redirect('library/index');
|
||||
}
|
||||
else
|
||||
{
|
||||
$errorMessage = "Wrong username or password provided. Please try again.";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->view->errorMessage = $errorMessage;
|
||||
$this->view->form = $form;
|
||||
|
||||
}
|
||||
|
||||
public function logoutAction()
|
||||
{
|
||||
Zend_Auth::getInstance()->clearIdentity();
|
||||
$this->_redirect('login/index');
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the adapter for authentication against a database table
|
||||
*
|
||||
* @return object
|
||||
*/
|
||||
protected function getAuthAdapter()
|
||||
{
|
||||
$dbAdapter = Zend_Db_Table::getDefaultAdapter();
|
||||
$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
|
||||
|
||||
$authAdapter->setTableName('cc_subjs')
|
||||
->setIdentityColumn('login')
|
||||
->setCredentialColumn('pass')
|
||||
->setCredentialTreatment('MD5(?)');
|
||||
|
||||
return $authAdapter;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
255
application/controllers/PlaylistController.php
Normal file
255
application/controllers/PlaylistController.php
Normal file
@ -0,0 +1,255 @@
|
||||
<?php
|
||||
|
||||
class PlaylistController extends Zend_Controller_Action
|
||||
{
|
||||
|
||||
protected $pl_sess = null;
|
||||
|
||||
public function init()
|
||||
{
|
||||
if(!Zend_Auth::getInstance()->hasIdentity())
|
||||
{
|
||||
$this->_redirect('login/index');
|
||||
}
|
||||
|
||||
$ajaxContext = $this->_helper->getHelper('AjaxContext');
|
||||
$ajaxContext->addActionContext('add-item', 'json')
|
||||
->addActionContext('delete-item', 'html')
|
||||
->addActionContext('set-fade', 'json')
|
||||
->addActionContext('set-cue', 'json')
|
||||
->addActionContext('move-item', 'html')
|
||||
->initContext();
|
||||
|
||||
$this->pl_sess = new Zend_Session_Namespace(UI_PLAYLIST_SESSNAME);
|
||||
}
|
||||
|
||||
public function indexAction()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public function newAction()
|
||||
{
|
||||
$pl_sess = $this->pl_sess;
|
||||
$userInfo = Zend_Auth::getInstance()->getStorage()->read();
|
||||
|
||||
$pl = new Playlist();
|
||||
$pl_id = $pl->create("Test Zend Auth");
|
||||
$pl->setPLMetaData('dc:creator', $userInfo->login);
|
||||
$pl->lock($userInfo->id);
|
||||
|
||||
//set this playlist as active id.
|
||||
$pl_sess->id = $pl_id;
|
||||
|
||||
$this->_helper->redirector('metadata');
|
||||
}
|
||||
|
||||
public function metadataAction()
|
||||
{
|
||||
$pl_sess = $this->pl_sess;
|
||||
|
||||
$request = $this->getRequest();
|
||||
$form = new Application_Form_PlaylistMetadata();
|
||||
|
||||
if ($this->getRequest()->isPost()) {
|
||||
if ($form->isValid($request->getPost())) {
|
||||
|
||||
$formdata = $form->getValues();
|
||||
|
||||
$pl = Playlist::Recall($pl_sess->id);
|
||||
$pl->setPLMetaData(UI_MDATA_KEY_TITLE, $formdata["title"]);
|
||||
|
||||
if(isset($formdata["description"]))
|
||||
$pl->setPLMetaData(UI_MDATA_KEY_DESCRIPTION, $formdata["description"]);
|
||||
|
||||
$this->_helper->redirector('edit');
|
||||
}
|
||||
}
|
||||
|
||||
$this->view->form = $form;
|
||||
}
|
||||
|
||||
public function editAction()
|
||||
{
|
||||
$this->view->headScript()->appendFile('/js/campcaster/playlist/playlist.js','text/javascript');
|
||||
|
||||
$pl_sess = $this->pl_sess;
|
||||
|
||||
if(isset($pl_sess->id)) {
|
||||
|
||||
$pl = Playlist::Recall($pl_sess->id);
|
||||
|
||||
$this->view->playlistcontents = $pl->getContents();
|
||||
return;
|
||||
}
|
||||
|
||||
$this->_helper->redirector('index');
|
||||
}
|
||||
|
||||
public function addItemAction()
|
||||
{
|
||||
$pl_sess = $this->pl_sess;
|
||||
$id = $this->_getParam('id');
|
||||
|
||||
if (!is_null($id)) {
|
||||
if(isset($pl_sess->id)) {
|
||||
$pl = Playlist::Recall($pl_sess->id);
|
||||
$res = $pl->addAudioClip($id);
|
||||
|
||||
if (PEAR::isError($res)) {
|
||||
die('{"jsonrpc" : "2.0", "error" : {"message": ' + $res->getMessage() + '}}');
|
||||
}
|
||||
|
||||
die('{"jsonrpc" : "2.0"}');
|
||||
}
|
||||
die('{"jsonrpc" : "2.0", "error" : {"message": "no open playlist"}}');
|
||||
}
|
||||
|
||||
die('{"jsonrpc" : "2.0", "error" : {"message": "a file is not chosen"}}');
|
||||
}
|
||||
|
||||
public function moveItemAction()
|
||||
{
|
||||
$pl_sess = $this->pl_sess;
|
||||
|
||||
if(isset($pl_sess->id)) {
|
||||
|
||||
$oldPos = $this->_getParam('oldPos');
|
||||
$newPos = $this->_getParam('newPos');
|
||||
|
||||
$pl = Playlist::Recall($pl_sess->id);
|
||||
|
||||
$pl->moveAudioClip($oldPos, $newPos);
|
||||
|
||||
$this->view->playlistcontents = $pl->getContents();
|
||||
return;
|
||||
}
|
||||
|
||||
$this->_helper->redirector('index');
|
||||
}
|
||||
|
||||
public function deleteItemAction()
|
||||
{
|
||||
$pl_sess = $this->pl_sess;
|
||||
|
||||
if(isset($pl_sess->id)) {
|
||||
|
||||
$positions = $this->_getParam('pos', array());
|
||||
|
||||
$pl = Playlist::Recall($pl_sess->id);
|
||||
|
||||
if (!is_array($positions))
|
||||
$positions = array($positions);
|
||||
|
||||
//so the automatic updating of playlist positioning doesn't affect removal.
|
||||
sort($positions);
|
||||
$positions = array_reverse($positions);
|
||||
|
||||
foreach ($positions as $pos) {
|
||||
$pl->delAudioClip($pos);
|
||||
}
|
||||
|
||||
$this->view->playlistcontents = $pl->getContents();
|
||||
return;
|
||||
}
|
||||
|
||||
$this->_helper->redirector('index');
|
||||
}
|
||||
|
||||
public function setCueAction()
|
||||
{
|
||||
$pl_sess = $this->pl_sess;
|
||||
|
||||
if(isset($pl_sess->id)) {
|
||||
|
||||
$pos = $this->_getParam('pos');
|
||||
$cueIn = $this->_getParam('cueIn', null);
|
||||
$cueOut = $this->_getParam('cueOut', null);
|
||||
|
||||
$pl = Playlist::Recall($pl_sess->id);
|
||||
|
||||
$response = $pl->changeClipLength($pos, $cueIn, $cueOut);
|
||||
|
||||
die(json_encode($response));
|
||||
}
|
||||
|
||||
$this->_helper->redirector('index');
|
||||
}
|
||||
|
||||
public function setFadeAction()
|
||||
{
|
||||
$pl_sess = $this->pl_sess;
|
||||
|
||||
if(isset($pl_sess->id)) {
|
||||
|
||||
$pos = $this->_getParam('pos');
|
||||
$fadeIn = $this->_getParam('fadeIn', null);
|
||||
$fadeOut = $this->_getParam('fadeOut', null);
|
||||
|
||||
$pl = Playlist::Recall($pl_sess->id);
|
||||
|
||||
$response = $pl->changeFadeInfo($pos, $fadeIn, $fadeOut);
|
||||
|
||||
die(json_encode($response));
|
||||
}
|
||||
|
||||
$this->_helper->redirector('index');
|
||||
}
|
||||
|
||||
public function deleteAction()
|
||||
{
|
||||
$id = $this->_getParam('id', null);
|
||||
|
||||
if (!is_null($id)) {
|
||||
|
||||
$this->closePlaylist();
|
||||
Playlist::Delete($id);
|
||||
}
|
||||
}
|
||||
|
||||
public function deleteActiveAction()
|
||||
{
|
||||
$pl_sess = $this->pl_sess;
|
||||
|
||||
if(isset($pl_sess->id)) {
|
||||
|
||||
$pl = Playlist::Recall($pl_sess->id);
|
||||
$this->closePlaylist($pl);
|
||||
|
||||
Playlist::Delete($pl_sess->id);
|
||||
|
||||
unset($pl_sess->id);
|
||||
}
|
||||
|
||||
$this->_helper->redirector('index');
|
||||
}
|
||||
|
||||
public function closePlaylist($pl)
|
||||
{
|
||||
$userInfo = Zend_Auth::getInstance()->getStorage()->read();
|
||||
$res = $pl->unlock($userInfo->id);
|
||||
return $res;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
179
application/controllers/PluploadController.php
Normal file
179
application/controllers/PluploadController.php
Normal file
@ -0,0 +1,179 @@
|
||||
<?php
|
||||
|
||||
class PluploadController extends Zend_Controller_Action
|
||||
{
|
||||
|
||||
public function init()
|
||||
{
|
||||
if(!Zend_Auth::getInstance()->hasIdentity())
|
||||
{
|
||||
$this->_redirect('login/index');
|
||||
}
|
||||
|
||||
$ajaxContext = $this->_helper->getHelper('AjaxContext');
|
||||
$ajaxContext->addActionContext('upload', 'json')
|
||||
->initContext();
|
||||
}
|
||||
|
||||
public function indexAction()
|
||||
{
|
||||
// action body
|
||||
}
|
||||
|
||||
public function uploadAction()
|
||||
{
|
||||
// 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
|
||||
$targetDir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload";
|
||||
$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"] : '';
|
||||
|
||||
// Clean the fileName for security reasons
|
||||
//$fileName = preg_replace('/[^\w\._]+/', '', $fileName);
|
||||
|
||||
// Create target dir
|
||||
if (!file_exists($targetDir))
|
||||
@mkdir($targetDir);
|
||||
|
||||
// Remove old temp files
|
||||
if (is_dir($targetDir) && ($dir = opendir($targetDir))) {
|
||||
while (($file = readdir($dir)) !== false) {
|
||||
$filePath = $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"];
|
||||
|
||||
if (strpos($contentType, "multipart") !== false) {
|
||||
if (isset($_FILES['file']['tmp_name']) && is_uploaded_file($_FILES['file']['tmp_name'])) {
|
||||
// Open temp file
|
||||
$out = fopen($targetDir . DIRECTORY_SEPARATOR . $fileName, $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($targetDir . DIRECTORY_SEPARATOR . $fileName, $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"}');
|
||||
}
|
||||
|
||||
$audio_file = $targetDir . DIRECTORY_SEPARATOR . $fileName;
|
||||
|
||||
$md5 = md5_file($audio_file);
|
||||
$duplicate = StoredFile::RecallByMd5($md5);
|
||||
if ($duplicate) {
|
||||
if (PEAR::isError($duplicate)) {
|
||||
die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": ' . $duplicate->getMessage() .'}}');
|
||||
}
|
||||
else {
|
||||
$duplicateName = $duplicate->getMetadataValue(UI_MDATA_KEY_TITLE);
|
||||
die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "An identical audioclip named ' . $duplicateName . ' already exists in the storage server."}}');
|
||||
}
|
||||
}
|
||||
|
||||
$metadata = camp_get_audio_metadata($audio_file);
|
||||
|
||||
if (PEAR::isError($metadata)) {
|
||||
die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": ' + $metadata->getMessage() + '}}');
|
||||
}
|
||||
|
||||
// #2196 no id tag -> use the original filename
|
||||
if (basename($audio_file) == $metadata[UI_MDATA_KEY_TITLE]) {
|
||||
$metadata[UI_MDATA_KEY_TITLE] = basename($audio_file);
|
||||
$metadata[UI_MDATA_KEY_FILENAME] = basename($audio_file);
|
||||
}
|
||||
|
||||
// setMetadataBatch doesnt like these values
|
||||
unset($metadata['audio']);
|
||||
unset($metadata['playtime_seconds']);
|
||||
|
||||
$values = array(
|
||||
"filename" => basename($audio_file),
|
||||
"filepath" => $audio_file,
|
||||
"filetype" => "audioclip",
|
||||
"mime" => $metadata[UI_MDATA_KEY_FORMAT],
|
||||
"md5" => $md5
|
||||
);
|
||||
$storedFile = StoredFile::Insert($values);
|
||||
|
||||
if (PEAR::isError($storedFile)) {
|
||||
die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": ' + $storedFile->getMessage() + '}}');
|
||||
}
|
||||
|
||||
$storedFile->setMetadataBatch($metadata);
|
||||
|
||||
// Return JSON-RPC response
|
||||
die('{"jsonrpc" : "2.0", "id" : '.$storedFile->getId().' }');
|
||||
}
|
||||
|
||||
public function pluploadAction()
|
||||
{
|
||||
$view = $this->view;
|
||||
|
||||
$view->headScript()->appendFile('/js/plupload/plupload.full.min.js','text/javascript');
|
||||
$view->headScript()->appendFile('/js/plupload/jquery.plupload.queue.min.js','text/javascript');
|
||||
$view->headScript()->appendFile('/js/campcaster/library/plupload.js','text/javascript');
|
||||
|
||||
$view->headLink()->appendStylesheet('/css/plupload.queue.css');
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
53
application/controllers/ScheduleController.php
Normal file
53
application/controllers/ScheduleController.php
Normal file
@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
class ScheduleController extends Zend_Controller_Action
|
||||
{
|
||||
|
||||
public function init()
|
||||
{
|
||||
if(!Zend_Auth::getInstance()->hasIdentity())
|
||||
{
|
||||
$this->_redirect('login/index');
|
||||
}
|
||||
|
||||
$ajaxContext = $this->_helper->getHelper('AjaxContext');
|
||||
$ajaxContext->addActionContext('event-feed', 'json')
|
||||
->addActionContext('add-show-dialog', 'json')
|
||||
->initContext();
|
||||
}
|
||||
|
||||
public function indexAction()
|
||||
{
|
||||
$this->view->headScript()->appendFile('/js/fullcalendar/fullcalendar.min.js','text/javascript');
|
||||
$this->view->headScript()->appendFile('/js/campcaster/schedule/schedule.js','text/javascript');
|
||||
|
||||
$this->view->headLink()->appendStylesheet('/css/fullcalendar.css');
|
||||
$this->view->headLink()->appendStylesheet('/css/schedule.css');
|
||||
}
|
||||
|
||||
public function eventFeedAction()
|
||||
{
|
||||
$start = $this->_getParam('start', null);
|
||||
$end = $this->_getParam('end', null);
|
||||
$weekday = $this->_getParam('weekday', null);
|
||||
|
||||
$userInfo = Zend_Auth::getInstance()->getStorage()->read();
|
||||
|
||||
$show = new Show($userInfo->type);
|
||||
$this->view->events = $show->getFullCalendarEvents($start, $end, $weekday);
|
||||
}
|
||||
|
||||
public function addShowDialogAction()
|
||||
{
|
||||
$user = new User();
|
||||
|
||||
$this->view->hosts = $user->getHosts();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
77
application/controllers/SearchController.php
Normal file
77
application/controllers/SearchController.php
Normal file
@ -0,0 +1,77 @@
|
||||
<?php
|
||||
|
||||
class SearchController extends Zend_Controller_Action
|
||||
{
|
||||
|
||||
protected $form;
|
||||
|
||||
public function init()
|
||||
{
|
||||
if(!Zend_Auth::getInstance()->hasIdentity())
|
||||
{
|
||||
$this->_redirect('login/index');
|
||||
}
|
||||
|
||||
$ajaxContext = $this->_helper->getHelper('AjaxContext');
|
||||
$ajaxContext->addActionContext('newfield', 'html')
|
||||
->initContext();
|
||||
|
||||
$this->form = new Application_Form_AdvancedSearch();
|
||||
}
|
||||
|
||||
public function indexAction()
|
||||
{
|
||||
// action body
|
||||
}
|
||||
|
||||
public function displayAction()
|
||||
{
|
||||
$this->view->headScript()->appendFile('/js/campcaster/library/advancedsearch.js','text/javascript');
|
||||
$this->view->headLink()->appendStylesheet('/css/library_search.css');
|
||||
|
||||
$this->form = new Application_Form_AdvancedSearch();
|
||||
$form = $this->form;
|
||||
|
||||
// Form has not been submitted - pass to view and return
|
||||
if (!$this->getRequest()->isPost()) {
|
||||
$sub = new Application_Form_AdvancedSearchRow(1);
|
||||
$form->addSubForm($sub, 'row_1');
|
||||
$form->getSubForm('row_1')->removeDecorator('DtDdWrapper');
|
||||
|
||||
$this->view->form = $form;
|
||||
return;
|
||||
}
|
||||
|
||||
// Form has been submitted - run data through preValidation()
|
||||
$form->preValidation($_POST);
|
||||
|
||||
if (!$form->isValid($_POST)) {
|
||||
$this->view->form = $form;
|
||||
return;
|
||||
}
|
||||
|
||||
// Form is valid
|
||||
$this->view->form = $form;
|
||||
|
||||
$info = $form->getValues();
|
||||
$this->view->files = StoredFile::searchFiles($info);
|
||||
}
|
||||
|
||||
public function newfieldAction()
|
||||
{
|
||||
$id = $this->_getParam('id', 1);
|
||||
|
||||
$this->form->addSubForm(new Application_Form_AdvancedSearchRow($id), 'row_'.$id, $id);
|
||||
|
||||
$this->form->getSubForm('row_'.$id)->removeDecorator('DtDdWrapper');
|
||||
$e = $this->form->getSubForm('row_'.$id);
|
||||
|
||||
$this->view->field = $e->__toString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
147
application/controllers/plugins/Acl_plugin.php
Normal file
147
application/controllers/plugins/Acl_plugin.php
Normal file
@ -0,0 +1,147 @@
|
||||
<?php
|
||||
|
||||
class Zend_Controller_Plugin_Acl extends Zend_Controller_Plugin_Abstract
|
||||
{
|
||||
/**
|
||||
* @var Zend_Acl
|
||||
**/
|
||||
protected $_acl;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
**/
|
||||
protected $_roleName;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
**/
|
||||
protected $_errorPage;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param mixed $aclData
|
||||
* @param $roleName
|
||||
* @return void
|
||||
**/
|
||||
public function __construct(Zend_Acl $aclData, $roleName = 'guest')
|
||||
{
|
||||
$this->_errorPage = array('module' => 'default',
|
||||
'controller' => 'error',
|
||||
'action' => 'denied');
|
||||
|
||||
$this->_roleName = $roleName;
|
||||
|
||||
if (null !== $aclData) {
|
||||
$this->setAcl($aclData);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the ACL object
|
||||
*
|
||||
* @param mixed $aclData
|
||||
* @return void
|
||||
**/
|
||||
public function setAcl(Zend_Acl $aclData)
|
||||
{
|
||||
$this->_acl = $aclData;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ACL object
|
||||
*
|
||||
* @return Zend_Acl
|
||||
**/
|
||||
public function getAcl()
|
||||
{
|
||||
return $this->_acl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the ACL role used
|
||||
*
|
||||
* @return string
|
||||
* @author
|
||||
**/
|
||||
public function getRoleName()
|
||||
{
|
||||
return $this->_roleName;
|
||||
}
|
||||
|
||||
public function setRoleName($type)
|
||||
{
|
||||
$roles = array("A" => "admin", "H" => "host", "G" => "guest");
|
||||
$this->_roleName = $roles[$type];
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the error page
|
||||
*
|
||||
* @param string $action
|
||||
* @param string $controller
|
||||
* @param string $module
|
||||
* @return void
|
||||
**/
|
||||
public function setErrorPage($action, $controller = 'error', $module = null)
|
||||
{
|
||||
$this->_errorPage = array('module' => $module,
|
||||
'controller' => $controller,
|
||||
'action' => $action);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the error page
|
||||
*
|
||||
* @return array
|
||||
**/
|
||||
public function getErrorPage()
|
||||
{
|
||||
return $this->_errorPage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Predispatch
|
||||
* Checks if the current user identified by roleName has rights to the requested url (module/controller/action)
|
||||
* If not, it will call denyAccess to be redirected to errorPage
|
||||
*
|
||||
* @return void
|
||||
**/
|
||||
public function preDispatch(Zend_Controller_Request_Abstract $request)
|
||||
{
|
||||
if (Zend_Auth::getInstance()->hasIdentity()){
|
||||
$userInfo = Zend_Auth::getInstance()->getStorage()->read();
|
||||
$this->setRoleName($userInfo->type);
|
||||
}
|
||||
else {
|
||||
$this->_roleName = "guest";
|
||||
}
|
||||
|
||||
$resourceName = '';
|
||||
|
||||
if ($request->getModuleName() != 'default') {
|
||||
$resourceName .= strtolower($request->getModuleName()) . ':';
|
||||
}
|
||||
|
||||
$resourceName .= strtolower($request->getControllerName());
|
||||
|
||||
/** Check if the controller/action can be accessed by the current user */
|
||||
if (!$this->getAcl()->isAllowed($this->_roleName, $resourceName, $request->getActionName())) {
|
||||
/** Redirect to access denied page */
|
||||
$this->denyAccess();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Deny Access Function
|
||||
* Redirects to errorPage, this can be called from an action using the action helper
|
||||
*
|
||||
* @return void
|
||||
**/
|
||||
public function denyAccess()
|
||||
{
|
||||
$this->_request->setModuleName($this->_errorPage['module']);
|
||||
$this->_request->setControllerName($this->_errorPage['controller']);
|
||||
$this->_request->setActionName($this->_errorPage['action']);
|
||||
}
|
||||
}
|
||||
51
application/forms/AdvancedSearch.php
Normal file
51
application/forms/AdvancedSearch.php
Normal file
@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
class Application_Form_AdvancedSearch extends Zend_Form
|
||||
{
|
||||
|
||||
public function init()
|
||||
{
|
||||
$this->addElement('hidden', 'search_next_id', array(
|
||||
'value' => 2
|
||||
));
|
||||
$this->getElement('search_next_id')->removeDecorator('Label')->removeDecorator('HtmlTag');
|
||||
}
|
||||
|
||||
public function preValidation(array $data) {
|
||||
|
||||
function findId($name) {
|
||||
$t = explode("_", $name);
|
||||
return $t[1];
|
||||
}
|
||||
|
||||
// array_filter callback
|
||||
function findFields($field) {
|
||||
return strpos($field, 'row') !== false;
|
||||
}
|
||||
|
||||
$fields = array_filter(array_keys($data), 'findFields');
|
||||
|
||||
foreach ($fields as $field) {
|
||||
// use id to set new order
|
||||
$id = findId($field);
|
||||
$this->addNewField($data, $id);
|
||||
}
|
||||
}
|
||||
|
||||
public function addNewField($data, $id) {
|
||||
|
||||
$sub = new Application_Form_AdvancedSearchRow($id);
|
||||
|
||||
$values = array("metadata_".$id => $data["row_".$id]["metadata_".$id],
|
||||
"match_".$id => $data["row_".$id]["match_".$id],
|
||||
"search_".$id => $data["row_".$id]["search_".$id]);
|
||||
|
||||
$sub->setDefaults($values);
|
||||
|
||||
$this->addSubForm($sub, 'row_'.$id, $id);
|
||||
$this->getSubForm('row_'.$id)->removeDecorator('DtDdWrapper');
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
81
application/forms/AdvancedSearchRow.php
Normal file
81
application/forms/AdvancedSearchRow.php
Normal file
@ -0,0 +1,81 @@
|
||||
<?php
|
||||
|
||||
class Application_Form_AdvancedSearchRow extends Zend_Form_SubForm
|
||||
{
|
||||
|
||||
protected $_rowid;
|
||||
|
||||
public function __construct($id = null)
|
||||
{
|
||||
$this->_rowid = $id;
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
public function init()
|
||||
{
|
||||
$id = $this->_rowid;
|
||||
|
||||
$this->addElement(
|
||||
'select',
|
||||
'metadata_'.$id,
|
||||
array(
|
||||
'required' => true,
|
||||
'multiOptions' => array(
|
||||
"dc:title" => "Title",
|
||||
"dc:format" => "Format",
|
||||
"dc:creator" => "Artist/Creator",
|
||||
"dc:source" => "Album",
|
||||
"ls:bitrate" => "Bitrate",
|
||||
"ls:samplerate" => "Samplerate",
|
||||
"dcterms:extent" => "Length",
|
||||
"dc:description" => "Comments",
|
||||
"dc:type" => "Genre",
|
||||
"ls:channels" => "channels",
|
||||
"ls:year" => "Year",
|
||||
"ls:track_num" => "track_number",
|
||||
"ls:mood" => "mood",
|
||||
"ls:bpm" => "BPM",
|
||||
"ls:rating" => "rating",
|
||||
"ls:encoded_by" => "encoded_by",
|
||||
"dc:publisher" => "label",
|
||||
"ls:composer" => "Composer",
|
||||
"ls:encoder" => "Encoder",
|
||||
"ls:lyrics" => "lyrics",
|
||||
"ls:orchestra" => "orchestra",
|
||||
"ls:conductor" => "conductor",
|
||||
"ls:lyricist" => "lyricist",
|
||||
"ls:originallyricist" => "original_lyricist",
|
||||
"ls:isrcnumber" => "isrc_number",
|
||||
"dc:language" => "Language",
|
||||
),
|
||||
)
|
||||
);
|
||||
$this->getElement('metadata_'.$id)->removeDecorator('Label')->removeDecorator('HtmlTag');
|
||||
|
||||
$this->addElement(
|
||||
'select',
|
||||
'match_'.$id,
|
||||
array(
|
||||
'required' => true,
|
||||
'multiOptions' => array(
|
||||
"0" => "partial",
|
||||
"1" => "=",
|
||||
"2" => "<",
|
||||
"3" => "<=",
|
||||
"4" => ">",
|
||||
"5" => ">=",
|
||||
"6" => "!=",
|
||||
),
|
||||
)
|
||||
);
|
||||
$this->getElement('match_'.$id)->removeDecorator('Label')->removeDecorator('HtmlTag');
|
||||
|
||||
$this->addElement('text', 'search_'.$id, array(
|
||||
'required' => true,
|
||||
));
|
||||
$this->getElement('search_'.$id)->removeDecorator('Label')->removeDecorator('HtmlTag');
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
13
application/forms/EditAudioMD.php
Normal file
13
application/forms/EditAudioMD.php
Normal file
@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
class Application_Form_EditAudioMD extends Zend_Form
|
||||
{
|
||||
|
||||
public function init()
|
||||
{
|
||||
/* Form Elements & Other Definitions Here ... */
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
41
application/forms/Login.php
Normal file
41
application/forms/Login.php
Normal file
@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
class Application_Form_Login extends Zend_Form
|
||||
{
|
||||
|
||||
public function init()
|
||||
{
|
||||
// Set the method for the display form to POST
|
||||
$this->setMethod('post');
|
||||
|
||||
// Add username element
|
||||
$this->addElement('text', 'username', array(
|
||||
'label' => 'Username:',
|
||||
'required' => true,
|
||||
'filters' => array('StringTrim'),
|
||||
'validators' => array(
|
||||
'NotEmpty',
|
||||
)
|
||||
));
|
||||
|
||||
// Add password element
|
||||
$this->addElement('password', 'password', array(
|
||||
'label' => 'Password:',
|
||||
'required' => true,
|
||||
'filters' => array('StringTrim'),
|
||||
'validators' => array(
|
||||
'NotEmpty',
|
||||
)
|
||||
));
|
||||
|
||||
// Add the submit button
|
||||
$this->addElement('submit', 'submit', array(
|
||||
'ignore' => true,
|
||||
'label' => 'Login',
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
36
application/forms/PlaylistMetadata.php
Normal file
36
application/forms/PlaylistMetadata.php
Normal file
@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
class Application_Form_PlaylistMetadata extends Zend_Form
|
||||
{
|
||||
|
||||
public function init()
|
||||
{
|
||||
// Set the method for the display form to POST
|
||||
$this->setMethod('post');
|
||||
|
||||
// Add username element
|
||||
$this->addElement('text', 'title', array(
|
||||
'label' => 'Title:',
|
||||
'required' => true,
|
||||
'filters' => array('StringTrim'),
|
||||
'validators' => array(
|
||||
'NotEmpty',
|
||||
)
|
||||
));
|
||||
|
||||
// Add the comment element
|
||||
$this->addElement('textarea', 'description', array(
|
||||
'label' => 'Description:',
|
||||
'required' => false,
|
||||
));
|
||||
|
||||
// Add the submit button
|
||||
$this->addElement('submit', 'submit', array(
|
||||
'ignore' => true,
|
||||
'label' => 'Submit',
|
||||
));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
17
application/layouts/scripts/layout.phtml
Normal file
17
application/layouts/scripts/layout.phtml
Normal file
@ -0,0 +1,17 @@
|
||||
<!-- application/layouts/scripts/layout.phtml -->
|
||||
<?php echo $this->doctype() ?>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title>Campcaster</title>
|
||||
<?php echo $this->headScript() ?>
|
||||
<?php echo $this->headLink() ?>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="nav"><?php echo $this->navigation()->menu()->setRenderInvisible(true) ?></div>
|
||||
|
||||
<div id="content"><?php echo $this->layout()->content ?></div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
15
application/layouts/scripts/login.phtml
Normal file
15
application/layouts/scripts/login.phtml
Normal file
@ -0,0 +1,15 @@
|
||||
<!-- application/layouts/scripts/layout.phtml -->
|
||||
<?php echo $this->doctype() ?>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title>Campcaster</title>
|
||||
<?php echo $this->headScript() ?>
|
||||
<?php echo $this->headLink() ?>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<div id="login"><?php echo $this->layout()->content ?></div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
184
application/models/AccessRecur.php
Normal file
184
application/models/AccessRecur.php
Normal file
@ -0,0 +1,184 @@
|
||||
<?
|
||||
/**
|
||||
* AccessRecur class
|
||||
*
|
||||
* Handles recursive accessPlaylist/releasePlaylist.
|
||||
* Should be 'required_once' from LocStor.php only.
|
||||
*
|
||||
* @package Campcaster
|
||||
* @subpackage StorageServer
|
||||
* @copyright 2010 Sourcefabric O.P.S.
|
||||
* @license http://www.gnu.org/licenses/gpl.txt
|
||||
*/
|
||||
class AccessRecur {
|
||||
public $ls;
|
||||
public $sessid;
|
||||
|
||||
public function __construct(&$ls, $sessid)
|
||||
{
|
||||
$this->ls =& $ls;
|
||||
$this->sessid = $sessid;
|
||||
}
|
||||
|
||||
|
||||
public static function accessPlaylist(&$ls, $sessid, $plid, $parent='0')
|
||||
{
|
||||
$ppa = new AccessRecur($ls, $sessid);
|
||||
$r = $ls->accessPlaylist($sessid, $plid, FALSE, $parent);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$plRes = $r;
|
||||
$r = StoredFile::RecallByGunid($plid);
|
||||
if (is_null($r) || PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$ac = $r;
|
||||
$r = $ac->md->genPhpArray();
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$pla = $r;
|
||||
$r = $ppa->processPlaylist($pla, $plRes['token']);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$plRes['content'] = $r;
|
||||
return $plRes;
|
||||
}
|
||||
|
||||
|
||||
public static function releasePlaylist(&$ls, $sessid, $token)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$ppa = new AccessRecur($ls, $sessid);
|
||||
$r = $CC_DBC->getAll("
|
||||
SELECT to_hex(token)as token2, to_hex(gunid)as gunid
|
||||
FROM ".$CC_CONFIG['accessTable']."
|
||||
WHERE parent=x'{$token}'::bigint
|
||||
");
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$arr = $r;
|
||||
foreach ($arr as $i => $item) {
|
||||
extract($item); // token2, gunid
|
||||
$r = BasicStor::GetType($gunid);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$ftype = $r;
|
||||
# echo "$ftype/$token2\n";
|
||||
switch (strtolower($ftype)) {
|
||||
case "audioclip":
|
||||
$r = $ppa->ls->releaseRawAudioData($ppa->sessid, $token2);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
# var_dump($r);
|
||||
break;
|
||||
case "playlist":
|
||||
$r = $ppa->releasePlaylist($ppa->ls, $ppa->sessid, $token2);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
# var_dump($r);
|
||||
break;
|
||||
default:
|
||||
}
|
||||
}
|
||||
$r = $ppa->ls->releasePlaylist($ppa->sessid, $token, FALSE);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
return $r;
|
||||
}
|
||||
|
||||
|
||||
private function processPlaylist($pla, $parent)
|
||||
{
|
||||
$res = array();
|
||||
foreach ($pla['children'] as $ple) {
|
||||
switch ($ple['elementname']) {
|
||||
case "playlistElement":
|
||||
$r = $this->processPlaylistElement($ple, $parent);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
// $res = array_merge($res, $r);
|
||||
$res[] = $r;
|
||||
break;
|
||||
default:
|
||||
}
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
|
||||
private function processAudioClip($gunid, $parent)
|
||||
{
|
||||
$r = $this->ls->accessRawAudioData($this->sessid, $gunid, $parent);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
return $r;
|
||||
}
|
||||
|
||||
|
||||
private function processPlaylistElement($ple, $parent='0')
|
||||
{
|
||||
foreach ($ple['children'] as $ac) {
|
||||
switch ($ac['elementname']) {
|
||||
case "audioClip":
|
||||
$r = $this->processAudioClip($ac['attrs']['id'], $parent);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
return $r;
|
||||
case "playlist":
|
||||
// if(empty($ac['children'])){
|
||||
$r = $this->accessPlaylist($this->ls, $this->sessid,
|
||||
$ac['attrs']['id'], $parent);
|
||||
if (PEAR::isError($r)) {
|
||||
if ($r->getCode() != GBERR_NOTF) {
|
||||
return $r;
|
||||
} else {
|
||||
$r = $this->processPlaylist($ac, $parent);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$r = array(
|
||||
'content' => $r,
|
||||
'url' => NULL,
|
||||
'token' => NULL,
|
||||
'chsum' => NULL,
|
||||
'size' => NULL,
|
||||
'warning' => 'inline playlist?',
|
||||
);
|
||||
}
|
||||
}
|
||||
return $r;
|
||||
/*
|
||||
}else{
|
||||
$r = $this->processPlaylist($ac, $parent);
|
||||
if(PEAR::isError($r)) return $r;
|
||||
$res = array(
|
||||
'content' => $r,
|
||||
'url' => NULL,
|
||||
'token' => NULL,
|
||||
'chsum' => NULL,
|
||||
'size' => NULL,
|
||||
'warning' => 'inline playlist',
|
||||
);
|
||||
return $res;
|
||||
}
|
||||
*/
|
||||
break;
|
||||
default:
|
||||
}
|
||||
}
|
||||
return array();
|
||||
}
|
||||
|
||||
} // class AccessRecur
|
||||
?>
|
||||
622
application/models/Alib.php
Normal file
622
application/models/Alib.php
Normal file
@ -0,0 +1,622 @@
|
||||
<?php
|
||||
require_once('Subjects.php');
|
||||
|
||||
define('USE_ALIB_CLASSES', TRUE);
|
||||
define('ALIBERR_NOTLOGGED', 30);
|
||||
define('ALIBERR_NOTEXISTS', 31);
|
||||
|
||||
/**
|
||||
* Authentication/authorization class
|
||||
*
|
||||
* @package Campcaster
|
||||
* @subpackage Alib
|
||||
* @copyright 2010 Sourcefabric O.P.S.
|
||||
* @license http://www.gnu.org/licenses/gpl.txt
|
||||
*/
|
||||
class Alib {
|
||||
/* ======================================================= public methods */
|
||||
|
||||
/* ----------------------------------------------- session/authentication */
|
||||
|
||||
/**
|
||||
* Authenticate and create session
|
||||
*
|
||||
* @param string $login
|
||||
* @param string $pass
|
||||
* @return boolean|sessionId|PEAR_Error
|
||||
*/
|
||||
public static function Login($login, $pass)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
if (FALSE === Subjects::Authenticate($login, $pass)) {
|
||||
Subjects::SetTimeStamp($login, TRUE);
|
||||
return FALSE;
|
||||
}
|
||||
$sessid = Alib::_createSessid();
|
||||
if (PEAR::isError($sessid)) {
|
||||
return $sessid;
|
||||
}
|
||||
$userid = Subjects::GetSubjId($login);
|
||||
$sql = "INSERT INTO ".$CC_CONFIG['sessTable']." (sessid, userid, login, ts)"
|
||||
." VALUES('$sessid', '$userid', '$login', now())";
|
||||
$r = $CC_DBC->query($sql);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
Subjects::SetTimeStamp($login, FALSE);
|
||||
return $sessid;
|
||||
} // fn login
|
||||
|
||||
|
||||
/**
|
||||
* Logout and destroy session
|
||||
*
|
||||
* @param string $sessid
|
||||
* @return true|PEAR_Error
|
||||
*/
|
||||
public static function Logout($sessid)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$ct = Alib::CheckAuthToken($sessid);
|
||||
if ($ct === FALSE) {
|
||||
return PEAR::raiseError("Alib::logout: not logged ($sessid)",
|
||||
ALIBERR_NOTLOGGED, PEAR_ERROR_RETURN);
|
||||
} elseif (PEAR::isError($ct)) {
|
||||
return $ct;
|
||||
} else {
|
||||
$sql = "DELETE FROM ".$CC_CONFIG['sessTable']
|
||||
." WHERE sessid='$sessid'";
|
||||
$r = $CC_DBC->query($sql);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
} // fn logout
|
||||
|
||||
|
||||
/**
|
||||
* Return true if the token is valid
|
||||
*
|
||||
* @param string $sessid
|
||||
* @return boolean|PEAR_Error
|
||||
*/
|
||||
private static function CheckAuthToken($sessid)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$sql = "SELECT count(*) as cnt FROM ".$CC_CONFIG['sessTable']
|
||||
." WHERE sessid='$sessid'";
|
||||
$c = $CC_DBC->getOne($sql);
|
||||
return ($c == 1 ? TRUE : (PEAR::isError($c) ? $c : FALSE ));
|
||||
} //fn checkAuthToken
|
||||
|
||||
|
||||
/**
|
||||
* Set valid token in alib object
|
||||
*
|
||||
* @param string $sessid
|
||||
* @return TRUE|PEAR_Error
|
||||
*/
|
||||
// public function setAuthToken($sessid)
|
||||
// {
|
||||
// $r = $this->checkAuthToken($sessid);
|
||||
// if (PEAR::isError($r)) {
|
||||
// return $r;
|
||||
// }
|
||||
// if (!$r) {
|
||||
// return PEAR::raiseError("ALib::setAuthToken: invalid token ($sessid)");
|
||||
// }
|
||||
// //$this->sessid = $sessid;
|
||||
// return TRUE;
|
||||
// } // fn setAuthToken
|
||||
|
||||
|
||||
/* -------------------------------------------------------- authorization */
|
||||
/**
|
||||
* Insert permission record
|
||||
*
|
||||
* @param int $sid
|
||||
* local user/group id
|
||||
* @param string $action
|
||||
* @param int $oid
|
||||
* local object id
|
||||
* @param string $type
|
||||
* 'A'|'D' (allow/deny)
|
||||
* @return int
|
||||
* local permission id
|
||||
*/
|
||||
public static function AddPerm($sid, $action, $oid, $type='A')
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$permid = $CC_DBC->nextId($CC_CONFIG['permSequence']);
|
||||
$sql = "INSERT INTO ".$CC_CONFIG['permTable']." (permid, subj, action, obj, type)"
|
||||
." VALUES ($permid, $sid, '$action', $oid, '$type')";
|
||||
$r = $CC_DBC->query($sql);
|
||||
if (PEAR::isError($r)) {
|
||||
return($r);
|
||||
}
|
||||
return $permid;
|
||||
} // fn addPerm
|
||||
|
||||
|
||||
/**
|
||||
* Remove permission record
|
||||
*
|
||||
* @param int $permid
|
||||
* local permission id
|
||||
* @param int $subj
|
||||
* local user/group id
|
||||
* @param int $obj
|
||||
* local object id
|
||||
* @return boolean|PEAR_Error
|
||||
*/
|
||||
public static function RemovePerm($permid=NULL, $subj=NULL, $obj=NULL)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$ca = array();
|
||||
if ($permid) {
|
||||
$ca[] = "permid=$permid";
|
||||
}
|
||||
if ($subj) {
|
||||
$ca[] = "subj=$subj";
|
||||
}
|
||||
if ($obj) {
|
||||
$ca[] = "obj=$obj";
|
||||
}
|
||||
$cond = join(" AND ", $ca);
|
||||
if (!$cond) {
|
||||
return TRUE;
|
||||
}
|
||||
$sql = "DELETE FROM ".$CC_CONFIG['permTable']." WHERE $cond";
|
||||
return $CC_DBC->query($sql);
|
||||
} // fn removePerm
|
||||
|
||||
|
||||
/**
|
||||
* Return object related with permission record
|
||||
*
|
||||
* @param int $permid
|
||||
* local permission id
|
||||
* @return int
|
||||
* local object id
|
||||
*/
|
||||
public static function GetPermOid($permid)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$sql = "SELECT obj FROM ".$CC_CONFIG['permTable']." WHERE permid=$permid";
|
||||
$res = $CC_DBC->getOne($sql);
|
||||
return $res;
|
||||
} // fn GetPermOid
|
||||
|
||||
|
||||
/**
|
||||
* Check if specified subject have permission to specified action
|
||||
* on specified object
|
||||
*
|
||||
* Look for sequence of corresponding permissions and order it by
|
||||
* relevence, then test the most relevant for result.
|
||||
* High relevence have direct permission (directly for specified subject
|
||||
* and object. Relevance order is done by level distance in the object
|
||||
* tree, level distance in subjects (user/group system).
|
||||
* Similar way is used for permissions related to object classes.
|
||||
* But class-related permissions have lower priority then
|
||||
* object-tree-related.
|
||||
* Support for object classes can be disabled by USE_ALIB_CLASSES const.
|
||||
*
|
||||
* @param int $sid
|
||||
* subject id (user or group id)
|
||||
* @param string $action
|
||||
* from set defined in config
|
||||
* @param int $oid
|
||||
* object id (default: root node)
|
||||
* @return boolean|PEAR_Error
|
||||
*/
|
||||
public static function CheckPerm($sid, $action, $oid=NULL)
|
||||
{
|
||||
return TRUE;
|
||||
// global $CC_DBC;
|
||||
// global $CC_CONFIG;
|
||||
// if (!is_numeric($sid)) {
|
||||
// return FALSE;
|
||||
// }
|
||||
//// if (is_null($oid) or $oid=='') {
|
||||
//// $oid = M2tree::GetRootNode();
|
||||
//// }
|
||||
//// if (PEAR::isError($oid)) {
|
||||
//// return $oid;
|
||||
//// }
|
||||
// if (!is_numeric($oid)) {
|
||||
// return FALSE;
|
||||
// }
|
||||
// // query construction
|
||||
// // shortcuts:
|
||||
// // p: permTable,
|
||||
// // s: subjTable, m smembTable,
|
||||
// // t: treeTable ts: structTable,
|
||||
// // c: classTable, cm: cmembTable
|
||||
// // main query elements:
|
||||
// $q_flds = "m.level , p.subj, s.login, action, p.type, p.obj";
|
||||
// $q_from = $CC_CONFIG['permTable']." p ";
|
||||
// // joins for solving users/groups:
|
||||
// $q_join = "LEFT JOIN ".$CC_CONFIG['subjTable']." s ON s.id=p.subj ";
|
||||
// $q_join .= "LEFT JOIN ".$CC_CONFIG['smembTable']." m ON m.gid=p.subj ";
|
||||
// $q_cond = "p.action in('_all', '$action') AND
|
||||
// (s.id=$sid OR m.uid=$sid) ";
|
||||
// // coalesce -1 for higher priority of nongroup rows:
|
||||
// // action DESC order for lower priority of '_all':
|
||||
// $q_ordb = "ORDER BY coalesce(m.level,-1), action DESC, p.type DESC";
|
||||
// $q_flds0 = $q_flds;
|
||||
// $q_from0 = $q_from;
|
||||
// $q_join0 = $q_join;
|
||||
// $q_cond0 = $q_cond;
|
||||
// $q_ordb0 = $q_ordb;
|
||||
// // joins for solving object tree:
|
||||
// $q_flds .= ", t.name, ts.level as tlevel";
|
||||
// //$q_join .= "LEFT JOIN ".$CC_CONFIG['treeTable']." t ON t.id=p.obj ";
|
||||
// //$q_join .= "LEFT JOIN ".$CC_CONFIG['structTable']." ts ON ts.parid=p.obj ";
|
||||
// //$q_cond .= " AND (t.id=$oid OR ts.objid=$oid)";
|
||||
// // action DESC order is hack for lower priority of '_all':
|
||||
// $q_ordb = "ORDER BY coalesce(ts.level,0), m.level, action DESC, p.type DESC";
|
||||
// // query by tree:
|
||||
// $query1 = "SELECT $q_flds FROM $q_from $q_join WHERE $q_cond $q_ordb";
|
||||
// $r1 = $CC_DBC->getAll($query1);
|
||||
// if (PEAR::isError($r1)) {
|
||||
// return($r1);
|
||||
// }
|
||||
// // if there is row with type='A' on the top => permit
|
||||
// //$AllowedByTree =
|
||||
// // (is_array($r1) && count($r1)>0 && $r1[0]['type']=='A');
|
||||
// //$DeniedByTree =
|
||||
// // (is_array($r1) && count($r1)>0 && $r1[0]['type']=='D');
|
||||
//
|
||||
// if (!USE_ALIB_CLASSES) {
|
||||
// return $AllowedbyTree;
|
||||
// }
|
||||
//
|
||||
// // joins for solving object classes:
|
||||
// $q_flds = $q_flds0.", c.cname ";
|
||||
// $q_join = $q_join0."LEFT JOIN ".$CC_CONFIG['classTable']." c ON c.id=p.obj ";
|
||||
// $q_join .= "LEFT JOIN ".$CC_CONFIG['cmembTable']." cm ON cm.cid=p.obj ";
|
||||
// $q_cond = $q_cond0." AND (c.id=$oid OR cm.objid=$oid)";
|
||||
// $q_ordb = $q_ordb0;
|
||||
// // query by class:
|
||||
// $query2 = "SELECT $q_flds FROM $q_from $q_join WHERE $q_cond $q_ordb";
|
||||
// $r2 = $CC_DBC->getAll($query2);
|
||||
// if (PEAR::isError($r2)) {
|
||||
// return $r2;
|
||||
// }
|
||||
// $AllowedByClass =
|
||||
// (is_array($r2) && count($r2)>0 && $r2[0]['type']=='A');
|
||||
// // not used now:
|
||||
// // $DeniedByClass =
|
||||
// // (is_array($r2) && count($r2)>0 && $r2[0]['type']=='D');
|
||||
// $res = ($AllowedByTree || (!$DeniedByTree && $AllowedByClass));
|
||||
// return $res;
|
||||
} // fn CheckPerm
|
||||
|
||||
|
||||
/* ---------------------------------------------------------- object tree */
|
||||
|
||||
/**
|
||||
* Remove all permissions on object and then remove object itself
|
||||
*
|
||||
* @param int $id
|
||||
* @return void|PEAR_Error
|
||||
*/
|
||||
public static function RemoveObj($id)
|
||||
{
|
||||
$r = Alib::RemovePerm(NULL, NULL, $id);
|
||||
return $r;
|
||||
} // fn removeObj
|
||||
|
||||
/* --------------------------------------------------------- users/groups */
|
||||
|
||||
/**
|
||||
* Remove all permissions of subject and then remove subject itself
|
||||
*
|
||||
* @param string $login
|
||||
* @return void|PEAR_Error
|
||||
*/
|
||||
public static function RemoveSubj($login)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$uid = Subjects::GetSubjId($login);
|
||||
if (PEAR::isError($uid)) {
|
||||
return $uid;
|
||||
}
|
||||
if (is_null($uid)){
|
||||
return $CC_DBC->raiseError("Alib::removeSubj: Subj not found ($login)",
|
||||
ALIBERR_NOTEXISTS, PEAR_ERROR_RETURN);
|
||||
}
|
||||
$r = Alib::RemovePerm(NULL, $uid);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
return Subjects::RemoveSubj($login, $uid);
|
||||
} // fn RemoveSubj
|
||||
|
||||
|
||||
/* ------------------------------------------------------------- sessions */
|
||||
/**
|
||||
* Get login from session id (token)
|
||||
*
|
||||
* @param string $sessid
|
||||
* @return string|PEAR_Error
|
||||
*/
|
||||
public static function GetSessLogin($sessid)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$sql = "SELECT login FROM ".$CC_CONFIG['sessTable']." WHERE sessid='$sessid'";
|
||||
$r = $CC_DBC->getOne($sql);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
if (is_null($r)){
|
||||
return PEAR::raiseError("Alib::GetSessLogin:".
|
||||
" invalid session id ($sessid)",
|
||||
ALIBERR_NOTEXISTS, PEAR_ERROR_RETURN);
|
||||
}
|
||||
return $r;
|
||||
} // fn GetSessLogin
|
||||
|
||||
|
||||
/**
|
||||
* Get user id from session id.
|
||||
*
|
||||
* @param string $p_sessid
|
||||
* @return int|PEAR_Error
|
||||
*/
|
||||
public static function GetSessUserId($p_sessid)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$sql = "SELECT userid FROM ".$CC_CONFIG['sessTable']." WHERE sessid='$p_sessid'";
|
||||
$r = $CC_DBC->getOne($sql);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
if (is_null($r)) {
|
||||
return PEAR::raiseError("Alib::getSessUserId:".
|
||||
" invalid session id ($p_sessid)",
|
||||
ALIBERR_NOTEXISTS, PEAR_ERROR_RETURN);
|
||||
}
|
||||
return $r;
|
||||
} // fn getSessUserId
|
||||
|
||||
|
||||
/* --------------------------------------------------------- info methods */
|
||||
/**
|
||||
* Get all permissions on object.
|
||||
*
|
||||
* @param int $id
|
||||
* @return array|null|PEAR_Error
|
||||
*/
|
||||
public static function GetObjPerms($id)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$sql = "SELECT s.login, p.* FROM ".$CC_CONFIG['permTable']." p, ".$CC_CONFIG['subjTable']." s"
|
||||
." WHERE s.id=p.subj AND p.obj=$id";
|
||||
return $CC_DBC->getAll($sql);
|
||||
} // fn GetObjPerms
|
||||
|
||||
|
||||
/**
|
||||
* Get all permissions of subject.
|
||||
*
|
||||
* @param int $sid
|
||||
* @return array
|
||||
*/
|
||||
public static function GetSubjPerms($sid)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$sql = "SELECT *"
|
||||
." FROM ".$CC_CONFIG['permTable']
|
||||
." WHERE p.subj=$sid";
|
||||
// $sql = "SELECT t.name, t.type as otype , p.*"
|
||||
// ." FROM ".$CC_CONFIG['permTable']." p, ".$CC_CONFIG['treeTable']." t"
|
||||
// ." WHERE t.id=p.obj AND p.subj=$sid";
|
||||
$a1 = $CC_DBC->getAll($sql);
|
||||
return $a1;
|
||||
} // fn GetSubjPerms
|
||||
|
||||
|
||||
/* ------------------------ info methods related to application structure */
|
||||
/* (this part should be added/rewritten to allow defining/modifying/using
|
||||
* application structure)
|
||||
* (only very simple structure definition - in $CC_CONFIG - supported now)
|
||||
*/
|
||||
|
||||
/**
|
||||
* Get all actions
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function GetAllActions()
|
||||
{
|
||||
global $CC_CONFIG;
|
||||
return $CC_CONFIG['allActions'];
|
||||
} // fn GetAllActions
|
||||
|
||||
|
||||
/**
|
||||
* Get all allowed actions on specified object type.
|
||||
*
|
||||
* @param string $type
|
||||
* @return array
|
||||
*/
|
||||
public static function GetAllowedActions($type)
|
||||
{
|
||||
global $CC_CONFIG;
|
||||
return $CC_CONFIG['allowedActions'][$type];
|
||||
} // fn GetAllowedActions
|
||||
|
||||
|
||||
/* ====================================================== private methods */
|
||||
|
||||
/**
|
||||
* Create new session id. Return the new session ID.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private static function _createSessid()
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
for ($c = 1; $c > 0; ){
|
||||
$sessid = md5(uniqid(rand()));
|
||||
$sql = "SELECT count(*) FROM ".$CC_CONFIG['sessTable']
|
||||
." WHERE sessid='$sessid'";
|
||||
$c = $CC_DBC->getOne($sql);
|
||||
if (PEAR::isError($c)) {
|
||||
return $c;
|
||||
}
|
||||
}
|
||||
return $sessid;
|
||||
} // fn _createSessid
|
||||
|
||||
|
||||
/* =============================================== test and debug methods */
|
||||
|
||||
/**
|
||||
* Dump all permissions for debug
|
||||
*
|
||||
* @param string $indstr
|
||||
* indentation string
|
||||
* @param string $ind
|
||||
* actual indentation
|
||||
* @return string
|
||||
*/
|
||||
public static function DumpPerms($indstr=' ', $ind='')
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$sql = "SELECT s.login, p.action, p.type"
|
||||
." FROM ".$CC_CONFIG['permTable']." p, ".$CC_CONFIG['subjTable']." s"
|
||||
." WHERE s.id=p.subj"
|
||||
." ORDER BY p.permid";
|
||||
$arr = $CC_DBC->getAll($sql);
|
||||
if (PEAR::isError($arr)) {
|
||||
return $arr;
|
||||
}
|
||||
$r = $ind.join(', ', array_map(create_function('$v',
|
||||
'return "{$v[\'login\']}/{$v[\'action\']}/{$v[\'type\']}";'
|
||||
),
|
||||
$arr
|
||||
))."\n";
|
||||
return $r;
|
||||
} // fn dumpPerms
|
||||
|
||||
|
||||
/**
|
||||
* Delete everything form the permission table and session table.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function DeleteData()
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$CC_DBC->query("DELETE FROM ".$CC_CONFIG['permTable']);
|
||||
$CC_DBC->query("DELETE FROM ".$CC_CONFIG['sessTable']);
|
||||
Subjects::DeleteData();
|
||||
} // fn deleteData
|
||||
|
||||
|
||||
/**
|
||||
* Insert test permissions
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function TestData()
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$tdata = Subjects::TestData();
|
||||
$t =& $tdata['tree'];
|
||||
$c =& $tdata['classes'];
|
||||
$s =& $tdata['subjects'];
|
||||
$CC_DBC->setErrorHandling(PEAR_ERROR_PRINT);
|
||||
$perms = array(
|
||||
array($s['root'], '_all', $t['root'], 'A'),
|
||||
array($s['test1'], '_all', $t['pa'], 'A'),
|
||||
array($s['test1'], 'read', $t['s2b'], 'D'),
|
||||
array($s['test2'], 'addChilds', $t['pa'], 'D'),
|
||||
array($s['test2'], 'read', $t['i2'], 'A'),
|
||||
array($s['test2'], 'edit', $t['s1a'], 'A'),
|
||||
array($s['test1'], 'addChilds', $t['s2a'], 'D'),
|
||||
array($s['test1'], 'addChilds', $t['s2c'], 'D'),
|
||||
array($s['gr2'], 'addChilds', $t['i2'], 'A'),
|
||||
array($s['test3'], '_all', $t['t1'], 'D'),
|
||||
);
|
||||
if (USE_ALIB_CLASSES){
|
||||
$perms[] = array($s['test3'], 'read', $c['cl_sa'], 'D');
|
||||
$perms[] = array($s['test4'], 'editPerms', $c['cl2'], 'A');
|
||||
}
|
||||
foreach ($perms as $p){
|
||||
$o[] = $r = Alib::AddPerm($p[0], $p[1], $p[2], $p[3]);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
}
|
||||
$tdata['perms'] = $o;
|
||||
return $tdata;
|
||||
} // fn testData
|
||||
|
||||
|
||||
/**
|
||||
* Make basic test
|
||||
*
|
||||
* @return boolean|PEAR_Error
|
||||
*/
|
||||
public static function Test()
|
||||
{
|
||||
$p = Subjects::test();
|
||||
if (PEAR::isError($p)) {
|
||||
return $p;
|
||||
}
|
||||
Alib::DeleteData();
|
||||
$tdata = Alib::TestData();
|
||||
if (PEAR::isError($tdata)) {
|
||||
return $tdata;
|
||||
}
|
||||
$test_correct = "root/_all/A, test1/_all/A, test1/read/D,".
|
||||
" test2/addChilds/D, test2/read/A, test2/edit/A,".
|
||||
" test1/addChilds/D, test1/addChilds/D, gr2/addChilds/A,".
|
||||
" test3/_all/D";
|
||||
if (USE_ALIB_CLASSES){
|
||||
$test_correct .= ", test3/read/D, test4/editPerms/A";
|
||||
}
|
||||
$test_correct .= "\nno, yes\n";
|
||||
$r = Alib::DumpPerms();
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$test_dump = $r.
|
||||
(Alib::CheckPerm(
|
||||
$tdata['subjects']['test1'], 'read',
|
||||
$tdata['tree']['t1']
|
||||
)? 'yes':'no').", ".
|
||||
(Alib::CheckPerm(
|
||||
$tdata['subjects']['test1'], 'addChilds',
|
||||
$tdata['tree']['i2']
|
||||
)? 'yes':'no')."\n"
|
||||
;
|
||||
Alib::RemovePerm($tdata['perms'][1]);
|
||||
Alib::RemovePerm($tdata['perms'][3]);
|
||||
$test_correct .= "root/_all/A, test1/read/D,".
|
||||
" test2/read/A, test2/edit/A,".
|
||||
" test1/addChilds/D, test1/addChilds/D, gr2/addChilds/A,".
|
||||
" test3/_all/D";
|
||||
if (USE_ALIB_CLASSES) {
|
||||
$test_correct .= ", test3/read/D, test4/editPerms/A";
|
||||
}
|
||||
$test_correct .= "\n";
|
||||
$test_dump .= Alib::DumpPerms();
|
||||
Alib::DeleteData();
|
||||
if ($test_dump == $test_correct) {
|
||||
$test_log .= "alib: OK\n";
|
||||
return TRUE;
|
||||
} else {
|
||||
return PEAR::raiseError('Alib::test', 1, PEAR_ERROR_DIE, '%s'.
|
||||
"<pre>\ncorrect:\n{$test_correct}\n".
|
||||
"dump:\n{$test_dump}\n</pre>\n");
|
||||
}
|
||||
} // fn test
|
||||
|
||||
} // class Alib
|
||||
?>
|
||||
487
application/models/Backup.php
Executable file
487
application/models/Backup.php
Executable file
@ -0,0 +1,487 @@
|
||||
<?php
|
||||
define('BACKUP_EXT', 'tar');
|
||||
define('ACCESS_TYPE', 'backup');
|
||||
|
||||
/**
|
||||
* @package Campcaster
|
||||
* @subpackage StorageServer
|
||||
* @copyright 2010 Sourcefabric O.P.S.
|
||||
* @license http://www.gnu.org/licenses/gpl.txt
|
||||
*/
|
||||
class Backup
|
||||
{
|
||||
/**
|
||||
* Name of logfile
|
||||
* @var string
|
||||
*/
|
||||
private $logFile;
|
||||
|
||||
/**
|
||||
* Session id
|
||||
* @var string
|
||||
*/
|
||||
private $sessid;
|
||||
|
||||
/**
|
||||
* struct - see search criteria
|
||||
* @var array
|
||||
*/
|
||||
private $criteria;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $token;
|
||||
|
||||
/**
|
||||
* name of statusfile
|
||||
* @var string
|
||||
*/
|
||||
private $statusFile;
|
||||
|
||||
/**
|
||||
* Affected gunids
|
||||
* @var array
|
||||
*/
|
||||
private $ids;
|
||||
|
||||
/**
|
||||
* Array of affected filenames
|
||||
* @var array
|
||||
*/
|
||||
private $filenames = array();
|
||||
|
||||
/**
|
||||
* Base tmp name
|
||||
* @var string
|
||||
*/
|
||||
private $tmpName;
|
||||
|
||||
/**
|
||||
* Name of temporary tarball file
|
||||
* @var string
|
||||
*/
|
||||
private $tmpFile;
|
||||
|
||||
/**
|
||||
* Name of temporary directory
|
||||
* @var string
|
||||
*/
|
||||
private $tmpDir;
|
||||
|
||||
/**
|
||||
* Name of temporary playlist directory
|
||||
* @var string
|
||||
*/
|
||||
private $tmpDirPlaylist;
|
||||
|
||||
/**
|
||||
* Name of temporary audioclip directory
|
||||
* @var string
|
||||
*/
|
||||
private $tmpDirClip;
|
||||
|
||||
/**
|
||||
* Name of temporary metafile directory
|
||||
* @var string
|
||||
*/
|
||||
private $tmpDirMeta;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $loglevel = 'warn'; # 'debug';
|
||||
|
||||
/**
|
||||
* @var GreenBox
|
||||
*/
|
||||
private $gb;
|
||||
|
||||
/**
|
||||
* @param GreeenBox $gb
|
||||
*/
|
||||
public function __construct(&$gb)
|
||||
{
|
||||
global $CC_CONFIG;
|
||||
$this->gb =& $gb;
|
||||
$this->token = null;
|
||||
$this->logFile = $CC_CONFIG['bufferDir'].'/'.ACCESS_TYPE.'.log';
|
||||
$this->addLogItem("-I- ".date("Ymd-H:i:s")." construct\n");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Open a backup
|
||||
* Create a backup file (tarball)
|
||||
*
|
||||
* @param string $sessid
|
||||
* @param array $criteria
|
||||
* struct - see search criteria
|
||||
* @return array
|
||||
* hasharray with field:
|
||||
* token string: backup token
|
||||
*/
|
||||
public function openBackup($sessid, $criteria='')
|
||||
{
|
||||
if ($this->loglevel=='debug') {
|
||||
$this->addLogItem("-I- ".date("Ymd-H:i:s")." openBackup - sessid:$sessid\n");
|
||||
}
|
||||
$this->sessid = $sessid;
|
||||
$this->criteria = $criteria;
|
||||
|
||||
// get ids (and real filenames) which files match with criteria
|
||||
$srch = $this->gb->localSearch($this->criteria,$this->sessid);
|
||||
if (PEAR::isError($srch)) {
|
||||
return $srch;
|
||||
}
|
||||
$this->setIDs($srch);
|
||||
|
||||
// get real filenames
|
||||
if (is_array($this->ids)) {
|
||||
$this->setFilenames();
|
||||
|
||||
$this->setEnviroment(true);
|
||||
|
||||
// write a status file
|
||||
file_put_contents($this->statusFile, 'working');
|
||||
|
||||
// save the metafile to tmpdir
|
||||
$hostname = trim(`hostname`);
|
||||
$ctime = time();
|
||||
$ctime_f = date("Ymd-H:i:s");
|
||||
file_put_contents("{$this->tmpDirMeta}/storage.xml",
|
||||
"<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n".
|
||||
"<storage\n".
|
||||
" type=\"".ACCESS_TYPE."\"\n".
|
||||
" version=\"1.0\"\n".
|
||||
" ctime=\"$ctime\"\n".
|
||||
" hostname=\"$hostname\"\n".
|
||||
"/><!-- $ctime_f -->\n"
|
||||
);
|
||||
|
||||
// copy all file to tmpdir
|
||||
$this->copyAllFiles();
|
||||
|
||||
// do everything
|
||||
$this->doIt();
|
||||
|
||||
return array('token'=>$this->token);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check the status of backup.
|
||||
*
|
||||
* @param unknown $token
|
||||
* @return array
|
||||
* status : string - susccess | working | fault
|
||||
* faultString: string - description of fault
|
||||
* token : stirng - backup token
|
||||
* url : string - access url
|
||||
* tmpfile : string - access filename
|
||||
*/
|
||||
public function checkBackup($token)
|
||||
{
|
||||
global $CC_CONFIG;
|
||||
if ($this->loglevel=='debug') {
|
||||
$this->addLogItem("-I- ".date("Ymd-H:i:s")." checkBackup - token:$token\n");
|
||||
}
|
||||
$this->token = $token;
|
||||
$this->setEnviroment();
|
||||
$status = file_get_contents($this->statusFile);
|
||||
if (strpos($status,'fault')!==false) {
|
||||
list($status,$faultString) = explode('|',$status);
|
||||
}
|
||||
switch ($status) {
|
||||
case 'success':
|
||||
$r['url'] = BasicStor::GetUrlPart()."access/$token.".BACKUP_EXT;
|
||||
$r['tmpfile'] = $CC_CONFIG['accessDir']."/$token.".BACKUP_EXT;
|
||||
case 'working':
|
||||
case 'fault':
|
||||
$r['status'] = $status;
|
||||
$r['faultString'] = $faultString;
|
||||
$r['token'] = $token;
|
||||
break;
|
||||
}
|
||||
return $r;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Close a backup
|
||||
*
|
||||
* @param unknown $token
|
||||
* @return boolean
|
||||
*/
|
||||
public function closeBackup($token)
|
||||
{
|
||||
if ($this->loglevel=='debug') {
|
||||
$this->addLogItem("-I- ".date("Ymd-H:i:s")." closeBackup - token:$token\n");
|
||||
}
|
||||
# post procedures
|
||||
$this->token = $token;
|
||||
$this->setEnviroment();
|
||||
BasicStor::bsRelease($token, ACCESS_TYPE);
|
||||
Backup::rRmDir($this->tmpDir);
|
||||
unlink($this->statusFile);
|
||||
unlink($this->tmpFile);
|
||||
if (is_file($this->tmpName)) {
|
||||
unlink($this->tmpName);
|
||||
}
|
||||
return !is_file($this->tmpFile);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* list of unclosed backups
|
||||
*
|
||||
* @param string $stat
|
||||
* if this parameter is not set, then return with all unclosed backups
|
||||
* @return array of hasharray with field:
|
||||
* status : string - susccess | working | fault
|
||||
* token : stirng - backup token
|
||||
* url : string - access url
|
||||
*/
|
||||
public function listBackups($stat='')
|
||||
{
|
||||
if ($this->loglevel=='debug') {
|
||||
$this->addLogItem("-I- ".date("Ymd-H:i:s")." listBackups - stat:$stat\n");
|
||||
}
|
||||
// open temporary dir
|
||||
$tokens = BasicStor::GetTokensByType(ACCESS_TYPE);
|
||||
// echo '<XMP>tokens:'; print_r($tokens); echo '</XMP>';
|
||||
foreach ($tokens as $token) {
|
||||
$st = $this->checkBackup($token);
|
||||
if ($stat=='' || $st['status']==$stat) {
|
||||
$r[] = $st;
|
||||
}
|
||||
}
|
||||
return $r;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the ids from searchResult
|
||||
*
|
||||
* @param array $searchResult : array of gunids
|
||||
*/
|
||||
private function setIDs($searchResult)
|
||||
{
|
||||
if ($this->loglevel=='debug') {
|
||||
$this->addLogItem("-I- ".date("Ymd-H:i:s")." setIDs\n");
|
||||
}
|
||||
if (is_array($searchResult['results'])) {
|
||||
$this->ids = $searchResult['results'];
|
||||
} else {
|
||||
$this->addLogItem("-E- ".date("Ymd-H:i:s")." setIDs - the parameter is not array!\n");
|
||||
return PEAR::raiseError('The IDs variable isn\'t array.');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set the filenames from ids.
|
||||
*
|
||||
*/
|
||||
private function setFilenames()
|
||||
{
|
||||
// if ($this->loglevel=='debug') {
|
||||
// $this->addLogItem("-I- ".date("Ymd-H:i:s")." setFilenames\n");
|
||||
// }
|
||||
// if (is_array($this->ids)) {
|
||||
// foreach ($this->ids as $i => $item) {
|
||||
// $gunid = $item['gunid'];
|
||||
// // get a stored file object of this gunid
|
||||
// $sf = StoredFile::RecallByGunid($gunid);
|
||||
// if (is_null($sf) || PEAR::isError($sf)) {
|
||||
// return $sf;
|
||||
// }
|
||||
// $lid = BasicStor::IdFromGunid($gunid);
|
||||
// if (($res = BasicStor::Authorize('read', $lid, $this->sessid)) !== TRUE) {
|
||||
// $this->addLogItem("-E- ".date("Ymd-H:i:s")." setFilenames - authorize gunid:$gunid\n");
|
||||
// return PEAR::raiseError('Backup::setFilenames : Authorize ... error.');
|
||||
// }
|
||||
// // if the file is a playlist then it has only a meta file
|
||||
// if (strtolower($sf->md->format) != 'playlist') {
|
||||
// $this->filenames[] = array(
|
||||
// 'filename' => $sf->getRealFileName(),
|
||||
// 'format' => $sf->md->format
|
||||
// );
|
||||
// }
|
||||
// $this->filenames[] = array(
|
||||
// 'filename' => $sf->getRealMetadataFileName(),
|
||||
// 'format' => $sf->md->format
|
||||
// );
|
||||
// if ($this->loglevel=='debug') {
|
||||
// $this->addLogItem("-I- ".date("Ymd-H:i:s")." setFilenames - add file: {$sf->md->format}|".$sf->getRealMetadataFileName()."\n");
|
||||
// }
|
||||
// }
|
||||
// return $this->filenames;
|
||||
// } else {
|
||||
// $this->addLogItem("-E- ".date("Ymd-H:i:s")." setFilenames - The IDs variable isn't array.\n");
|
||||
// return PEAR::raiseError('Backup::setFilenames : The IDs variable isn\'t array.');
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create the tarball - call the shell script
|
||||
*
|
||||
*/
|
||||
private function doIt()
|
||||
{
|
||||
if ($this->loglevel=='debug') {
|
||||
$this->addLogItem("-I- ".date("Ymd-H:i:s")." doIt\n");
|
||||
}
|
||||
$command = dirname(__FILe__)."/../bin/backup.sh"
|
||||
." {$this->tmpDir}"
|
||||
." {$this->tmpFile}"
|
||||
." {$this->statusFile}"
|
||||
." >> {$this->logFile} &";
|
||||
$res = system("$command");
|
||||
sleep(2);
|
||||
if ($this->loglevel=='debug') {
|
||||
$this->addLogItem("-I- ".date("Ymd-H:i:s")." doIt - command:$command\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Copy the real files into the tmp dirs to tar they.
|
||||
*
|
||||
*/
|
||||
private function copyAllFiles()
|
||||
{
|
||||
if ($this->loglevel=='debug') {
|
||||
$this->addLogItem("-I- ".date("Ymd-H:i:s")." copyAllFiles\n");
|
||||
}
|
||||
//echo '<XMP>this->filenames:'; print_r($this->filenames); echo '</XMP>';
|
||||
if (is_array($this->filenames)) {
|
||||
foreach ($this->filenames as $v) {
|
||||
# get the filename from full path
|
||||
$fn = substr($v['filename'],strrpos($v['filename'],'/'));
|
||||
switch (strtolower($v['format'])) {
|
||||
case 'playlist':
|
||||
# if playlist then copy to the playlist dir
|
||||
copy($v['filename'],$this->tmpDirPlaylist.$fn);
|
||||
break;
|
||||
case 'audioclip':
|
||||
# if audioclip then copy to the audioclip dir
|
||||
copy($v['filename'],$this->tmpDirClip.$fn);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Figure out the enviroment to the backup
|
||||
*
|
||||
*/
|
||||
private function setEnviroment($createDir=false)
|
||||
{
|
||||
global $CC_CONFIG;
|
||||
if ($this->loglevel=='debug') {
|
||||
$this->addLogItem("-I- ".date("Ymd-H:i:s")." setEnviroment - createDirs:$createDir\n");
|
||||
}
|
||||
// create temporary directories
|
||||
if (is_null($this->token) && $createDir) {
|
||||
$this->tmpName = tempnam($CC_CONFIG['bufferDir'], ACCESS_TYPE.'_');
|
||||
$this->tmpFile = $this->tmpName.'.'.BACKUP_EXT;
|
||||
$this->tmpDir = $this->tmpName.'.dir';
|
||||
$this->tmpDirPlaylist = $this->tmpDir. '/playlist';
|
||||
$this->tmpDirClip = $this->tmpDir. '/audioClip';
|
||||
$this->tmpDirMeta = $this->tmpDir. '/meta-inf';
|
||||
touch($this->tmpFile);
|
||||
mkdir($this->tmpDir);
|
||||
mkdir($this->tmpDirPlaylist);
|
||||
mkdir($this->tmpDirClip);
|
||||
mkdir($this->tmpDirMeta);
|
||||
$this->genToken();
|
||||
} else {
|
||||
$symlink = $CC_CONFIG['accessDir'].'/'.$this->token.'.'.BACKUP_EXT;
|
||||
if (is_link($symlink) && is_file(readlink($symlink))) {
|
||||
$this->tmpName = str_replace('.tar','',readlink($symlink));
|
||||
$this->tmpFile = $this->tmpName.'.'.BACKUP_EXT;
|
||||
$this->tmpDir = $this->tmpName.'.dir';
|
||||
$this->tmpDirPlaylist = $this->tmpDir. '/playlist';
|
||||
$this->tmpDirClip = $this->tmpDir. '/audioClip';
|
||||
$this->tmpDirMeta = $this->tmpDir. '/meta-inf';
|
||||
} else {
|
||||
$this->addLogItem("-E- ".date("Ymd-H:i:s")." setEnviroment - Corrupt symbolic link.\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
$this->statusFile = $CC_CONFIG['accessDir'].'/'.$this->token.'.'.BACKUP_EXT.'.status';
|
||||
if ($this->loglevel=='debug') {
|
||||
$this->addLogItem("this->tmpName: $this->tmpName\n");
|
||||
$this->addLogItem("this->tmpFile: $this->tmpFile\n");
|
||||
$this->addLogItem("this->tmpDir: $this->tmpDir\n");
|
||||
$this->addLogItem("this->tmpDirPlaylist: $this->tmpDirPlaylist\n");
|
||||
$this->addLogItem("this->tmpDirClip: $this->tmpDirClip\n");
|
||||
$this->addLogItem("this->tmpDirMeta: $this->tmpDirMeta\n");
|
||||
$this->addLogItem("this->token: $this->token\n");
|
||||
$this->addLogItem("this->statusFile: $this->statusFile\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Generate a new token.
|
||||
* @return void
|
||||
*/
|
||||
private function genToken()
|
||||
{
|
||||
$acc = BasicStor::bsAccess($this->tmpFile, BACKUP_EXT, null, ACCESS_TYPE);
|
||||
if (PEAR::isError($acc)) {
|
||||
return $acc;
|
||||
}
|
||||
$this->token = $acc['token'];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add a line to the logfile.
|
||||
*
|
||||
* @param string $item
|
||||
* the new row of log file
|
||||
*/
|
||||
private function addLogItem($item)
|
||||
{
|
||||
$f = fopen($this->logFile,'a');
|
||||
fwrite($f,$item);
|
||||
fclose($f);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Delete a directory recursive
|
||||
*
|
||||
* @param string $dirname
|
||||
* path of dir.
|
||||
*/
|
||||
private static function rRmDir($dirname)
|
||||
{
|
||||
if (is_dir($dirname)) {
|
||||
$dir_handle = opendir($dirname);
|
||||
}
|
||||
while ($file = readdir($dir_handle)) {
|
||||
if ( ($file != ".") && ($file != "..") ) {
|
||||
if (!is_dir($dirname."/".$file)) {
|
||||
unlink ($dirname."/".$file);
|
||||
} else {
|
||||
Backup::rRmDir($dirname."/".$file);
|
||||
}
|
||||
}
|
||||
}
|
||||
closedir($dir_handle);
|
||||
rmdir($dirname);
|
||||
return true;
|
||||
}
|
||||
|
||||
} // classs Backup
|
||||
?>
|
||||
2186
application/models/BasicStor.php
Normal file
2186
application/models/BasicStor.php
Normal file
File diff suppressed because it is too large
Load Diff
1726
application/models/GreenBox.php
Normal file
1726
application/models/GreenBox.php
Normal file
File diff suppressed because it is too large
Load Diff
1749
application/models/LocStor.php
Normal file
1749
application/models/LocStor.php
Normal file
File diff suppressed because it is too large
Load Diff
352
application/models/M3uPlaylist.php
Normal file
352
application/models/M3uPlaylist.php
Normal file
@ -0,0 +1,352 @@
|
||||
<?
|
||||
define('INDCH', ' ');
|
||||
|
||||
/**
|
||||
* M3uPlaylist class
|
||||
*
|
||||
* @package Campcaster
|
||||
* @subpackage StorageServer
|
||||
* @copyright 2010 Sourcefabric O.P.S.
|
||||
* @license http://www.gnu.org/licenses/gpl.txt
|
||||
*/
|
||||
class M3uPlaylist {
|
||||
|
||||
/**
|
||||
* Parse M3U file or string
|
||||
*
|
||||
* @param string $data
|
||||
* local path to M3U file or M3U string
|
||||
* @param string $loc
|
||||
* location: 'file'|'string'
|
||||
* @return array
|
||||
* reference, parse result tree (or PEAR::error)
|
||||
*/
|
||||
function &parse($data='', $loc='file')
|
||||
{
|
||||
switch ($loc) {
|
||||
case "file":
|
||||
if (!is_file($data)) {
|
||||
return PEAR::raiseError(
|
||||
"M3uPlaylist::parse: file not found ($data)"
|
||||
);
|
||||
}
|
||||
if (!is_readable($data)) {
|
||||
return PEAR::raiseError(
|
||||
"M3uPlaylist::parse: can't read file ($data)"
|
||||
);
|
||||
}
|
||||
$data = file_get_contents($data);
|
||||
case "string":
|
||||
$arr = preg_split("|\n#EXTINF: |", $data);
|
||||
if ($arr[0] != '#EXTM3U') {
|
||||
return PEAR::raiseError(
|
||||
"M3uPlaylist::parse: invalid M3U header"
|
||||
);
|
||||
}
|
||||
array_shift($arr);
|
||||
break;
|
||||
default:
|
||||
return PEAR::raiseError(
|
||||
"M3uPlaylist::parse: unsupported data location ($loc)"
|
||||
);
|
||||
}
|
||||
return $arr;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Import M3U file to storage
|
||||
*
|
||||
* @param GreenBox $gb
|
||||
* @param string $aPath
|
||||
* absolute path part of imported file (e.g. /home/user/campcaster)
|
||||
* @param string $rPath
|
||||
* relative path/filename part of imported file
|
||||
* (e.g. playlists/playlist_1.smil)
|
||||
* @param array $gunids
|
||||
* hash relation from filenames to gunids
|
||||
* @param string $plid
|
||||
* playlist gunid
|
||||
* @param int $subjid
|
||||
* local subject (user) id (id of user doing the import)
|
||||
* @return Playlist
|
||||
*/
|
||||
function import(&$gb, $aPath, $rPath, &$gunids, $plid, $subjid=NULL)
|
||||
{
|
||||
// $path = realpath("$aPath/$rPath");
|
||||
// if (FALSE === $path) {
|
||||
// return PEAR::raiseError(
|
||||
// "M3uPlaylist::import: file doesn't exist ($aPath/$rPath)"
|
||||
// );
|
||||
// }
|
||||
// $arr = M3uPlaylist::parse($path);
|
||||
// if (PEAR::isError($arr)) {
|
||||
// return $arr;
|
||||
// }
|
||||
// require_once("Playlist.php");
|
||||
// $pl =& Playlist::create($gb, $plid, "imported_M3U");
|
||||
// if (PEAR::isError($pl)) {
|
||||
// return $pl;
|
||||
// }
|
||||
// $r = $pl->lock($gb, $subjid);
|
||||
// if (PEAR::isError($r)) {
|
||||
// return $r;
|
||||
// }
|
||||
// foreach ($arr as $i => $it) {
|
||||
// list($md, $uri) = preg_split("|\n|", $it);
|
||||
// list($length, $title) = preg_split("|, *|", $md);
|
||||
// // $gunid = StoredFile::CreateGunid();
|
||||
// $gunid = ( isset($gunids[basename($uri)]) ? $gunids[basename($uri)] : NULL);
|
||||
// $acId = BasicStor::IdFromGunid($gunid);
|
||||
// if (PEAR::isError($acId)) {
|
||||
// return $acId;
|
||||
// }
|
||||
// $length = Playlist::secondsToPlaylistTime($length);
|
||||
// $offset = '???';
|
||||
// if (preg_match("|\.([a-zA-Z0-9]+)$|", $uri, $va)) {
|
||||
// switch (strtolower($ext = $va[1])) {
|
||||
// case "lspl":
|
||||
// case "xml":
|
||||
// case "smil":
|
||||
// case "m3u":
|
||||
// $acId = $gb->bsImportPlaylistRaw($gunid,
|
||||
// $aPath, $uri, $ext, $gunids, $subjid);
|
||||
// if (PEAR::isError($acId)) {
|
||||
// break;
|
||||
// }
|
||||
// //no break!
|
||||
// default:
|
||||
// if (is_null($gunid)) {
|
||||
// return PEAR::raiseError(
|
||||
// "M3uPlaylist::import: no gunid");
|
||||
// }
|
||||
// $r = $pl->addAudioClip($acId);
|
||||
// if (PEAR::isError($r)) {
|
||||
// return $r;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// $r = $pl->unlock($gb);
|
||||
// if (PEAR::isError($r)) {
|
||||
// return $r;
|
||||
// }
|
||||
// return $pl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Import M3U file to storage
|
||||
*
|
||||
* @param GreenBox $gb
|
||||
* @param string $data
|
||||
* local path to M3U file
|
||||
* @return string
|
||||
* XML playlist in Campcaster playlist format
|
||||
*/
|
||||
function convert2lspl(&$gb, $data)
|
||||
{
|
||||
$arr = M3uPlaylist::parse($data);
|
||||
if (PEAR::isError($arr)) {
|
||||
return $arr;
|
||||
}
|
||||
$ind = '';
|
||||
$ind2 = $ind.INDCH;
|
||||
$ind3 = $ind2.INDCH;
|
||||
$res = '';
|
||||
foreach ($arr as $i => $it) {
|
||||
list($md, $uri) = preg_split("|\n|", $it);
|
||||
list($length, $title) = preg_split("|, *|", $md);
|
||||
$gunid = StoredFile::CreateGunid();
|
||||
$gunid2 = StoredFile::CreateGunid();
|
||||
$length = Playlist::secondsToPlaylistTime($length);
|
||||
$offset = '???';
|
||||
$clipStart = '???';
|
||||
$clipEnd = '???';
|
||||
$clipLength = '???';
|
||||
$uri_h = preg_replace("|--|", "d;d;", htmlspecialchars("$uri"));
|
||||
if (preg_match("|\.([a-zA-Z0-9]+)$|", $uri, $va)) {
|
||||
switch (strtolower($ext = $va[1])) {
|
||||
case "lspl":
|
||||
case "xml":
|
||||
case "smil":
|
||||
case "m3u":
|
||||
$acOrPl = "$ind3<playlist id=\"$gunid2\" ".
|
||||
"playlength=\"$length\" title=\"$title\"/> ".
|
||||
"<!-- $uri_h -->\n";
|
||||
break;
|
||||
default:
|
||||
$acOrPl = "$ind3<audioClip id=\"$gunid2\" ".
|
||||
"playlength=\"$length\" title=\"$title\"/> ".
|
||||
"<!-- $uri_h -->\n";
|
||||
break;
|
||||
}
|
||||
}
|
||||
$res .= "$ind2<playlistElement id=\"$gunid\" relativeOffset=\"$offset\" clipStart=\"$clipStart\" clipEnd=\"$clipEnd\" clipLength=\"$clipLength\">\n".
|
||||
$acOrPl.
|
||||
"$ind2</playlistElement>\n";
|
||||
}
|
||||
$res = "$ind<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n".
|
||||
"$ind<playlist id=\"$gunid\" playlength=\"$playlength\" title=\"\">\n".
|
||||
"$ind2<metadata/>\n".
|
||||
"$res".
|
||||
"$ind</playlist>\n";
|
||||
return $res;
|
||||
}
|
||||
} // class M3uPlaylist
|
||||
|
||||
|
||||
/**
|
||||
* @package Campcaster
|
||||
* @subpackage StorageServer
|
||||
* @copyright 2010 Sourcefabric O.P.S.
|
||||
* @license http://www.gnu.org/licenses/gpl.txt
|
||||
*/
|
||||
class M3uPlaylistBodyElement {
|
||||
function convert2lspl(&$tree, $ind='')
|
||||
{
|
||||
$ind2 = $ind.INDCH;
|
||||
if ($tree->name != 'body') {
|
||||
return PEAR::raiseError("M3uPlaylist::parse: body tag expected");
|
||||
}
|
||||
if (isset($tree->children[1])) {
|
||||
return PEAR::raiseError(sprintf(
|
||||
"M3uPlaylist::parse: unexpected tag %s in tag body",
|
||||
$tree->children[1]->name
|
||||
));
|
||||
}
|
||||
$res = M3uPlaylistParElement::convert2lspl($tree->children[0], $ind2);
|
||||
if (PEAR::isError($res)) {
|
||||
return $res;
|
||||
}
|
||||
$gunid = StoredFile::CreateGunid();
|
||||
$playlength = '???'; // ***
|
||||
$res = "$ind<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n".
|
||||
"$ind<playlist id=\"$gunid\" playlength=\"$playlength\" title=\"\">\n".
|
||||
"$ind2<metadata/>\n".
|
||||
"$res".
|
||||
"$ind</playlist>\n";
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @package Campcaster
|
||||
* @subpackage StorageServer
|
||||
* @copyright 2010 Sourcefabric O.P.S.
|
||||
* @license http://www.gnu.org/licenses/gpl.txt
|
||||
*/
|
||||
class M3uPlaylistParElement {
|
||||
function convert2lspl(&$tree, $ind='')
|
||||
{
|
||||
if ($tree->name != 'par') {
|
||||
return PEAR::raiseError("M3uPlaylist::parse: par tag expected");
|
||||
}
|
||||
$res = '';
|
||||
foreach ($tree->children as $i => $ch) {
|
||||
$ch =& $tree->children[$i];
|
||||
$r = M3uPlaylistAudioElement::convert2lspl($ch, $ind.INDCH);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$res .= $r;
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @package Campcaster
|
||||
* @subpackage StorageServer
|
||||
* @copyright 2010 Sourcefabric O.P.S.
|
||||
* @license http://www.gnu.org/licenses/gpl.txt
|
||||
*/
|
||||
class M3uPlaylistAudioElement {
|
||||
function convert2lspl(&$tree, $ind='')
|
||||
{
|
||||
$ind2 = $ind.INDCH;
|
||||
if ($tree->name != 'audio') {
|
||||
return PEAR::raiseError("M3uPlaylist::parse: audio tag expected");
|
||||
}
|
||||
if (isset($tree->children[2])) {
|
||||
return PEAR::raiseError(sprintf(
|
||||
"M3uPlaylist::parse: unexpected tag %s in tag audio",
|
||||
$tree->children[2]->name
|
||||
));
|
||||
}
|
||||
$res = ''; $fadeIn = 0; $fadeOut = 0;
|
||||
foreach ($tree->children as $i => $ch) {
|
||||
$ch =& $tree->children[$i];
|
||||
$r = M3uPlaylistAnimateElement::convert2lspl($ch, $ind2);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
switch ($r['type']) {
|
||||
case "fadeIn":
|
||||
$fadeIn = $r['val'];
|
||||
break;
|
||||
case "fadeOut":
|
||||
$fadeOut = $r['val'];
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ($fadeIn > 0 || $fadeOut > 0) {
|
||||
$fadeIn = Playlist::secondsToPlaylistTime($fadeIn);
|
||||
$fadeOut = Playlist::secondsToPlaylistTime($fadeOut);
|
||||
$fInfo = "$ind2<fadeInfo fadeIn=\"$fadeIn\" fadeOut=\"$fadeOut\"/>\n";
|
||||
} else {
|
||||
$fInfo = '';
|
||||
}
|
||||
$plElGunid = StoredFile::CreateGunid();
|
||||
$aGunid = StoredFile::CreateGunid();
|
||||
$title = basename($tree->attrs['src']->val);
|
||||
$offset = Playlist::secondsToPlaylistTime($tree->attrs['begin']->val);
|
||||
$playlength = '???'; # ***
|
||||
$res = "$ind<playlistElement id=\"$plElGunid\" relativeOffset=\"$offset\">\n".
|
||||
"$ind2<audioClip id=\"$aGunid\" playlength=\"$playlength\" title=\"$title\"/>\n".
|
||||
$fInfo.
|
||||
"$ind</playlistElement>\n";
|
||||
return $res;
|
||||
}
|
||||
} // class M3uPlaylistAudioElement
|
||||
|
||||
|
||||
/**
|
||||
* @package Campcaster
|
||||
* @subpackage StorageServer
|
||||
* @copyright 2010 Sourcefabric O.P.S.
|
||||
* @license http://www.gnu.org/licenses/gpl.txt
|
||||
*/
|
||||
class M3uPlaylistAnimateElement {
|
||||
function convert2lspl(&$tree, $ind='') {
|
||||
if ($tree->name != 'animate') {
|
||||
return PEAR::raiseError("M3uPlaylist::parse: animate tag expected");
|
||||
}
|
||||
if ($tree->attrs['attributeName']->val == 'soundLevel' &&
|
||||
$tree->attrs['from']->val == '0%' &&
|
||||
$tree->attrs['to']->val == '100%' &&
|
||||
$tree->attrs['calcMode']->val == 'linear' &&
|
||||
$tree->attrs['fill']->val == 'freeze' &&
|
||||
$tree->attrs['begin']->val == '0s' &&
|
||||
preg_match("|^([0-9.]+)s$|", $tree->attrs['end']->val, $va)
|
||||
) {
|
||||
return array('type'=>'fadeIn', 'val'=>$va[1]);
|
||||
}
|
||||
if ($tree->attrs['attributeName']->val == 'soundLevel' &&
|
||||
$tree->attrs['from']->val == '100%' &&
|
||||
$tree->attrs['to']->val == '0%' &&
|
||||
$tree->attrs['calcMode']->val == 'linear' &&
|
||||
$tree->attrs['fill']->val == 'freeze' &&
|
||||
preg_match("|^([0-9.]+)s$|", $tree->attrs['begin']->val, $vaBegin) &&
|
||||
preg_match("|^([0-9.]+)s$|", $tree->attrs['end']->val, $vaEnd)
|
||||
) {
|
||||
return array('type'=>'fadeOut', 'val'=>($vaEnd[1] - $vaBegin[1]));
|
||||
}
|
||||
return PEAR::raiseError(
|
||||
"M3uPlaylistAnimateElement::convert2lspl: animate parameters too general"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
1422
application/models/Playlist.php
Normal file
1422
application/models/Playlist.php
Normal file
File diff suppressed because it is too large
Load Diff
445
application/models/Prefs.php
Normal file
445
application/models/Prefs.php
Normal file
@ -0,0 +1,445 @@
|
||||
<?php
|
||||
|
||||
require_once("GreenBox.php");
|
||||
|
||||
/**
|
||||
* Preference storage class.
|
||||
*
|
||||
* @package Campcaster
|
||||
* @subpackage StorageServer
|
||||
* @copyright 2010 Sourcefabric O.P.S.
|
||||
* @license http://www.gnu.org/licenses/gpl.txt
|
||||
* @see StoredFile
|
||||
*/
|
||||
/* ================== Prefs ================== */
|
||||
class Prefs {
|
||||
|
||||
public $gb;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param GreenBox $gb
|
||||
* GreenBox object reference
|
||||
*/
|
||||
public function __construct(&$gb)
|
||||
{
|
||||
$this->gb =& $gb;
|
||||
}
|
||||
|
||||
|
||||
/* ======================================================= public methods */
|
||||
/* ----------------------------------------------------- user preferences */
|
||||
/**
|
||||
* Read preference record by session id
|
||||
*
|
||||
* @param string $sessid
|
||||
* session id
|
||||
* @param string $key
|
||||
* preference key
|
||||
* @return string
|
||||
* preference value
|
||||
*/
|
||||
function loadPref($sessid, $key)
|
||||
{
|
||||
$subjid = GreenBox::GetSessUserId($sessid);
|
||||
if (PEAR::isError($subjid)) {
|
||||
return $subjid;
|
||||
}
|
||||
if (is_null($subjid)) {
|
||||
return PEAR::raiseError("Prefs::loadPref: invalid session id",
|
||||
GBERR_SESS);
|
||||
}
|
||||
$val = $this->readVal($subjid, $key);
|
||||
if (PEAR::isError($val)) {
|
||||
return $val;
|
||||
}
|
||||
if ($val === FALSE) {
|
||||
return PEAR::raiseError("Prefs::loadPref: invalid preference key",
|
||||
GBERR_PREF);
|
||||
}
|
||||
return $val;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Save preference record by session id
|
||||
*
|
||||
* @param string $sessid
|
||||
* session id
|
||||
* @param string $key
|
||||
* preference key
|
||||
* @param string $value
|
||||
* preference value
|
||||
* @return boolean
|
||||
*/
|
||||
function savePref($sessid, $key, $value)
|
||||
{
|
||||
$subjid = GreenBox::GetSessUserId($sessid);
|
||||
if (PEAR::isError($subjid)) {
|
||||
return $subjid;
|
||||
}
|
||||
if (is_null($subjid)) {
|
||||
return PEAR::raiseError("Prefs::savePref: invalid session id",
|
||||
GBERR_SESS);
|
||||
}
|
||||
$r = $this->update($subjid, $key, $value);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
if ($r === FALSE) {
|
||||
$r = $this->insert($subjid, $key, $value);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Delete preference record by session id
|
||||
*
|
||||
* @param string $sessid
|
||||
* session id
|
||||
* @param string $key
|
||||
* preference key
|
||||
* @return boolean
|
||||
*/
|
||||
function delPref($sessid, $key)
|
||||
{
|
||||
$subjid = GreenBox::GetSessUserId($sessid);
|
||||
if (PEAR::isError($subjid)) {
|
||||
return $subjid;
|
||||
}
|
||||
if (is_null($subjid)) {
|
||||
return PEAR::raiseError("Prefs::delPref: invalid session id",
|
||||
GBERR_SESS);
|
||||
}
|
||||
$r = $this->delete($subjid, $key);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
if ($r === FALSE) {
|
||||
return PEAR::raiseError("Prefs::delPref: invalid preference key",
|
||||
GBERR_PREF);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/* ---------------------------------------------------- group preferences */
|
||||
/**
|
||||
* Read group preference record
|
||||
*
|
||||
* @param string $group
|
||||
* group name
|
||||
* @param string $key
|
||||
* preference key
|
||||
* @param boolean $returnErrorIfKeyNotExists
|
||||
* If set to true and the key doesnt exist, return a PEAR error.
|
||||
* @return string
|
||||
* preference value
|
||||
*/
|
||||
function loadGroupPref($group, $key, $returnErrorIfKeyNotExists = true)
|
||||
{
|
||||
// if sessid is would be used here fix Transport::cronCallMethod !
|
||||
$subjid = Subjects::GetSubjId($group);
|
||||
if (PEAR::isError($subjid)) {
|
||||
return $subjid;
|
||||
}
|
||||
if (is_null($subjid)) {
|
||||
return PEAR::raiseError(
|
||||
"Prefs::loadGroupPref: invalid group name", ALIBERR_NOTGR);
|
||||
}
|
||||
$val = $this->readVal($subjid, $key);
|
||||
if (PEAR::isError($val)) {
|
||||
return $val;
|
||||
}
|
||||
if ($val === FALSE) {
|
||||
if ($returnErrorIfKeyNotExists) {
|
||||
return PEAR::raiseError(
|
||||
"Prefs::loadGroupPref: invalid preference key", GBERR_PREF);
|
||||
} else {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
return $val;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Save group preference record
|
||||
*
|
||||
* @param string $sessid
|
||||
* session id
|
||||
* @param string $group
|
||||
* group name
|
||||
* @param string $key
|
||||
* preference key
|
||||
* @param string $value
|
||||
* preference value
|
||||
* @return boolean
|
||||
*/
|
||||
function saveGroupPref($sessid, $group, $key, $value)
|
||||
{
|
||||
$uid = GreenBox::GetSessUserId($sessid);
|
||||
if (PEAR::isError($uid)) {
|
||||
return $uid;
|
||||
}
|
||||
if (is_null($uid)) {
|
||||
return PEAR::raiseError(
|
||||
"Prefs::saveGroupPref: invalid session id", GBERR_SESS);
|
||||
}
|
||||
$gid = Subjects::GetSubjId($group);
|
||||
if (PEAR::isError($gid)) {
|
||||
return $gid;
|
||||
}
|
||||
if (is_null($gid)) {
|
||||
return PEAR::raiseError(
|
||||
"Prefs::saveGroupPref: invalid group name", GBERR_SESS);
|
||||
}
|
||||
$memb = Subjects::IsMemberOf($uid, $gid);
|
||||
if (PEAR::isError($memb)) {
|
||||
return $memb;
|
||||
}
|
||||
if (!$memb) {
|
||||
return PEAR::raiseError(
|
||||
"Prefs::saveGroupPref: access denied", GBERR_DENY);
|
||||
}
|
||||
$r = $this->update($gid, $key, $value);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
if ($r === FALSE) {
|
||||
$r = $this->insert($gid, $key, $value);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete group preference record
|
||||
*
|
||||
* @param string $sessid
|
||||
* session id
|
||||
* @param string $group
|
||||
* group name
|
||||
* @param string $key
|
||||
* preference key
|
||||
* @return boolean
|
||||
*/
|
||||
function delGroupPref($sessid, $group, $key)
|
||||
{
|
||||
$uid = GreenBox::GetSessUserId($sessid);
|
||||
if (PEAR::isError($uid)) {
|
||||
return $uid;
|
||||
}
|
||||
if (is_null($uid)) {
|
||||
return PEAR::raiseError(
|
||||
"Prefs::delGroupPref: invalid session id", GBERR_SESS);
|
||||
}
|
||||
$gid = Subjects::GetSubjId($group);
|
||||
if (PEAR::isError($gid)) {
|
||||
return $gid;
|
||||
}
|
||||
if (is_null($gid)) {
|
||||
return PEAR::raiseError(
|
||||
"Prefs::delGroupPref: invalid group name", GBERR_SESS);
|
||||
}
|
||||
$memb = Subjects::IsMemberOf($uid, $gid);
|
||||
if (PEAR::isError($memb)) {
|
||||
return $memb;
|
||||
}
|
||||
if (!$memb) {
|
||||
return PEAR::raiseError(
|
||||
"Prefs::delGroupPref: access denied", GBERR_DENY);
|
||||
}
|
||||
$r = $this->delete($gid, $key);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
if ($r === FALSE) {
|
||||
return PEAR::raiseError(
|
||||
"Prefs::delGroupPref: invalid preference key", GBERR_PREF);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/* ==================================================== low level methods */
|
||||
/**
|
||||
* Insert of new preference record
|
||||
*
|
||||
* @param int $subjid
|
||||
* local user/group id
|
||||
* @param string $keystr
|
||||
* preference key
|
||||
* @param string $valstr
|
||||
* preference value
|
||||
* @return int
|
||||
* local user id
|
||||
*/
|
||||
public static function Insert($subjid, $keystr, $valstr='')
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$id = $CC_DBC->nextId($CC_CONFIG['prefSequence']);
|
||||
if (PEAR::isError($id)) {
|
||||
return $id;
|
||||
}
|
||||
$r = $CC_DBC->query("
|
||||
INSERT INTO ".$CC_CONFIG['prefTable']."
|
||||
(id, subjid, keystr, valstr)
|
||||
VALUES
|
||||
($id, $subjid, '$keystr', '$valstr')
|
||||
");
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
return $id;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Read value of preference record
|
||||
*
|
||||
* @param int $subjid
|
||||
* local user/group id
|
||||
* @param string $keystr
|
||||
* preference key
|
||||
* @return string
|
||||
* preference value
|
||||
*/
|
||||
function readVal($subjid, $keystr)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$val = $CC_DBC->getOne("
|
||||
SELECT valstr FROM ".$CC_CONFIG['prefTable']."
|
||||
WHERE subjid=$subjid AND keystr='$keystr'
|
||||
");
|
||||
if (PEAR::isError($val)) {
|
||||
return $val;
|
||||
}
|
||||
if (is_null($val)) {
|
||||
return FALSE;
|
||||
}
|
||||
return $val;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Read all keys of subject's preferences
|
||||
*
|
||||
* @param int $subjid
|
||||
* local user/group id
|
||||
* @return array
|
||||
* preference keys
|
||||
*/
|
||||
function readKeys($subjid)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$res = $CC_DBC->getAll("
|
||||
SELECT keystr FROM ".$CC_CONFIG['prefTable']."
|
||||
WHERE subjid=$subjid
|
||||
");
|
||||
if (PEAR::isError($res)) {
|
||||
return $res;
|
||||
}
|
||||
if (is_null($res)) {
|
||||
return FALSE;
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Update value of preference record
|
||||
*
|
||||
* @param int $subjid
|
||||
* local user/group id
|
||||
* @param string $keystr
|
||||
* preference key
|
||||
* @param string $newvalstr
|
||||
* new preference value
|
||||
* @return boolean
|
||||
*/
|
||||
function update($subjid, $keystr, $newvalstr='')
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$r = $CC_DBC->query("
|
||||
UPDATE ".$CC_CONFIG['prefTable']." SET
|
||||
valstr='$newvalstr'
|
||||
WHERE subjid=$subjid AND keystr='$keystr'
|
||||
");
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
if ($CC_DBC->affectedRows() < 1) {
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Delete preference record
|
||||
*
|
||||
* @param int $subjid
|
||||
* local user/group id
|
||||
* @param string $keystr
|
||||
* preference key
|
||||
* @return boolean
|
||||
*/
|
||||
function delete($subjid, $keystr)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$r = $CC_DBC->query("
|
||||
DELETE FROM ".$CC_CONFIG['prefTable']."
|
||||
WHERE subjid=$subjid AND keystr='$keystr'
|
||||
");
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
if ($CC_DBC->affectedRows() < 1) {
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/* ==================================================== auxiliary methods */
|
||||
/**
|
||||
* Test method
|
||||
*
|
||||
*/
|
||||
function test()
|
||||
{
|
||||
global $CC_CONFIG;
|
||||
$sessid = Alib::Login('root', $CC_CONFIG['tmpRootPass']);
|
||||
$testkey = 'testKey';
|
||||
$testVal = 'abcDef 0123 ěščřžýáíé ĚŠČŘŽÝÁÍÉ';
|
||||
$r = savePref($sessid, $testKey, $testVal);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$val = loadPref($sessid, $testKey);
|
||||
if ($val != $testVal) {
|
||||
echo "ERROR: preference storage test failed.\n ($testVal / $val)\n";
|
||||
return FALSE;
|
||||
}
|
||||
$r = savePref($sessid, $testKey, '');
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$val = loadPref($sessid, $testKey);
|
||||
if ($val != $testVal) {
|
||||
echo "ERROR: preference storage test failed.\n ('' / '$val')\n";
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
} // class Prefs
|
||||
?>
|
||||
290
application/models/Renderer.php
Normal file
290
application/models/Renderer.php
Normal file
@ -0,0 +1,290 @@
|
||||
<?php
|
||||
define('RENDER_EXT', 'ogg');
|
||||
|
||||
require_once("Playlist.php");
|
||||
|
||||
/**
|
||||
* Renderer caller class
|
||||
*
|
||||
* Playlist to file rendering - PHP layer, caller to the renderer executable
|
||||
*
|
||||
* @package Campcaster
|
||||
* @subpackage StorageServer
|
||||
* @copyright 2010 Sourcefabric O.P.S.
|
||||
* @license http://www.gnu.org/licenses/gpl.txt
|
||||
* @see LocStor
|
||||
*/
|
||||
class Renderer
|
||||
{
|
||||
|
||||
/**
|
||||
* Render playlist to ogg file (open handle)
|
||||
*
|
||||
* @param GreenBox $gb
|
||||
* greenbox object reference
|
||||
* @param string $plid
|
||||
* playlist gunid
|
||||
* @param int $owner
|
||||
* local subject id, owner of token
|
||||
* @return array
|
||||
* token: string - render token
|
||||
*/
|
||||
function rnRender2FileOpen(&$gb, $plid, $owner=NULL)
|
||||
{
|
||||
global $CC_CONFIG;
|
||||
// recall playlist:
|
||||
$pl = StoredFile::RecallByGunid($plid);
|
||||
if (is_null($pl) || PEAR::isError($pl)) {
|
||||
return $pl;
|
||||
}
|
||||
// smil export:
|
||||
$smil = $pl->outputToSmil();
|
||||
if (PEAR::isError($smil)) {
|
||||
return $smil;
|
||||
}
|
||||
// temporary file for smil:
|
||||
$tmpn = tempnam($CC_CONFIG['bufferDir'], 'plRender_');
|
||||
$smilf = "$tmpn.smil";
|
||||
file_put_contents($smilf, $smil);
|
||||
$url = "file://$smilf";
|
||||
// output file:
|
||||
$outf = "$tmpn.".RENDER_EXT;
|
||||
touch($outf);
|
||||
// logging:
|
||||
$logf = $CC_CONFIG['bufferDir']."/renderer.log";
|
||||
file_put_contents($logf, "--- ".date("Ymd-H:i:s")."\n", FILE_APPEND);
|
||||
// open access to output file: /*gunid*/ /*parent*/
|
||||
$acc = BasicStor::bsAccess($outf, RENDER_EXT, $plid, 'render', 0, $owner);
|
||||
if (PEAR::isError($acc)) {
|
||||
return $acc;
|
||||
}
|
||||
extract($acc);
|
||||
$statf = Renderer::getStatusFile($gb, $token);
|
||||
file_put_contents($statf, "working");
|
||||
// command:
|
||||
$stServDir = dirname(__FILE__)."/..";
|
||||
$renderExe = "$stServDir/bin/renderer.sh";
|
||||
$command = "$renderExe -p $url -o $outf -s $statf >> $logf &";
|
||||
file_put_contents($logf, "$command\n", FILE_APPEND);
|
||||
$res = system($command);
|
||||
if ($res === FALSE) {
|
||||
return PEAR::raiseError(
|
||||
'Renderer::rnRender2File: Error running renderer'
|
||||
);
|
||||
}
|
||||
return array('token'=>$token);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Render playlist to ogg file (check results)
|
||||
*
|
||||
* @param GreenBox $gb
|
||||
* GreenBox object reference
|
||||
* @param string $token
|
||||
* render token
|
||||
* @return array
|
||||
* status : string - success | working | fault
|
||||
* url : string - readable url
|
||||
*/
|
||||
function rnRender2FileCheck(&$gb, $token)
|
||||
{
|
||||
$statf = Renderer::getStatusFile($gb, $token);
|
||||
if (!file_exists($statf)) {
|
||||
return PEAR::raiseError(
|
||||
'Renderer::rnRender2FileCheck: Invalid token'
|
||||
);
|
||||
}
|
||||
$status = trim(file_get_contents($statf));
|
||||
$url = Renderer::getUrl($gb, $token);
|
||||
$tmpfile= Renderer::getLocalFile($gb, $token);
|
||||
return array('status'=>$status, 'url'=>$url, 'tmpfile'=>$tmpfile);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Render playlist to ogg file (list results)
|
||||
*
|
||||
* @param GreenBox $gb
|
||||
* greenbox object reference
|
||||
* @param string $stat
|
||||
* status (optional) if this parameter is not set, then return with all unclosed backups
|
||||
* @return array
|
||||
* array of hasharray:
|
||||
* status : string - success | working | fault
|
||||
* url : string - readable url
|
||||
*/
|
||||
function rnRender2FileList(&$gb,$stat='') {
|
||||
// open temporary dir
|
||||
$tokens = BasicStor::GetTokensByType('render');
|
||||
foreach ($tokens as $token) {
|
||||
$st = Renderer::rnRender2FileCheck($gb, $token);
|
||||
if ( ($stat=='') || ($st['status']==$stat) ) {
|
||||
$r[] = $st;
|
||||
}
|
||||
}
|
||||
return $r;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Render playlist to ogg file (close handle)
|
||||
*
|
||||
* @param GreenBox $gb
|
||||
* greenbox object reference
|
||||
* @param string $token
|
||||
* render token
|
||||
* @return mixed
|
||||
* TRUE or PEAR_Error
|
||||
*/
|
||||
function rnRender2FileClose(&$gb, $token)
|
||||
{
|
||||
global $CC_CONFIG;
|
||||
$r = BasicStor::bsRelease($token, 'render');
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$realOgg = $r['realFname'];
|
||||
$tmpn = $CC_CONFIG['bufferDir']."/".basename($realOgg, '.'.RENDER_EXT);
|
||||
$smilf = "$tmpn.smil";
|
||||
$statf = Renderer::getStatusFile($gb, $token);
|
||||
@unlink($statf);
|
||||
@unlink($realOgg);
|
||||
@unlink($smilf);
|
||||
@unlink($tmpn);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Render playlist to storage as audioClip (check results)
|
||||
*
|
||||
* @param GreenBox $gb
|
||||
* greenbox object reference
|
||||
* @param string $token
|
||||
* render token
|
||||
* @return array
|
||||
* status : string - success | working | fault
|
||||
* gunid: string - global unique id of result file
|
||||
*/
|
||||
function rnRender2StorageCheck(&$gb, $token)
|
||||
{
|
||||
$r = Renderer::rnRender2FileCheck($gb, $token);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$status = $r['status'];
|
||||
$res = array('status' => $status, 'gunid'=>'NULL');
|
||||
switch ($status) {
|
||||
case "fault":
|
||||
$res['faultString'] = "Error runing renderer";
|
||||
break;
|
||||
case "success":
|
||||
$r = Renderer::rnRender2StorageCore($gb, $token);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$res['gunid'] = $r['gunid'];
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Render playlist to storage as audioClip (core method)
|
||||
*
|
||||
* @param GreenBox $gb
|
||||
* greenbox object reference
|
||||
* @param string $token
|
||||
* render token
|
||||
* @return array:
|
||||
* gunid: string - global unique id of result file
|
||||
*/
|
||||
function rnRender2StorageCore(&$gb, $token)
|
||||
{
|
||||
// $r = BasicStor::bsRelease($token, 'render');
|
||||
// if (PEAR::isError($r)) {
|
||||
// return $r;
|
||||
// }
|
||||
// $realOgg = $r['realFname'];
|
||||
// $owner = $r['owner'];
|
||||
// $gunid = $r['gunid'];
|
||||
// $fileName = 'rendered_playlist';
|
||||
// $id = BasicStor::IdFromGunid($gunid);
|
||||
// if (PEAR::isError($id)) {
|
||||
// return $id;
|
||||
// }
|
||||
// $mdata = '';
|
||||
// foreach (array('dc:title', 'dcterms:extent', 'dc:creator', 'dc:description') as $item) {
|
||||
// $val = $gb->bsGetMetadataValue($id, $item);
|
||||
// $mdata .= " <$item>$val</$item>\n";
|
||||
// }
|
||||
// $mdata = "<audioClip>\n <metadata>\n$mdata </metadata>\n</audioClip>\n";
|
||||
// //$mdata = "<audioClip>\n <metadata>\n$mdata<dcterms:extent>0</dcterms:extent>\n</metadata>\n</audioClip>\n";
|
||||
// $values = array(
|
||||
// "filename" => $fileName,
|
||||
// "filepath" => $realOgg,
|
||||
// "metadata" => $mdata,
|
||||
// "filetype" => "audioclip"
|
||||
// );
|
||||
// $storedFile = $gb->bsPutFile($values);
|
||||
// if (PEAR::isError($storedFile)) {
|
||||
// return $storedFile;
|
||||
// }
|
||||
// return array('gunid' => $storedFile->getGunid());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return local filepath of rendered file
|
||||
*
|
||||
* @param Greenbox $gb
|
||||
* greenbox object reference
|
||||
* @param string $token
|
||||
* render token
|
||||
* @return array
|
||||
*/
|
||||
function getLocalFile(&$gb, $token)
|
||||
{
|
||||
global $CC_CONFIG;
|
||||
$token = StoredFile::NormalizeGunid($token);
|
||||
return $CC_CONFIG['accessDir']."/$token.".RENDER_EXT;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return filepath of render status file
|
||||
*
|
||||
* @param GreenBox $gb
|
||||
* greenbox object reference
|
||||
* @param string $token
|
||||
* render token
|
||||
* @return array
|
||||
*/
|
||||
function getStatusFile(&$gb, $token)
|
||||
{
|
||||
return Renderer::getLocalFile($gb, $token).".status";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return remote accessible URL for rendered file
|
||||
*
|
||||
* @param GreenBox $gb
|
||||
* greenbox object reference
|
||||
* @param string $token
|
||||
* render token
|
||||
* @return array
|
||||
*/
|
||||
function getUrl(&$gb, $token)
|
||||
{
|
||||
$token = StoredFile::NormalizeGunid($token);
|
||||
return BasicStor::GetUrlPart()."access/$token.".RENDER_EXT;
|
||||
}
|
||||
|
||||
} // class Renderer
|
||||
|
||||
?>
|
||||
436
application/models/Restore.php
Normal file
436
application/models/Restore.php
Normal file
@ -0,0 +1,436 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @package Campcaster
|
||||
* @subpackage StorageServer
|
||||
* @copyright 2010 Sourcefabric O.P.S.
|
||||
* @license http://www.gnu.org/licenses/gpl.txt
|
||||
*/
|
||||
class Restore {
|
||||
/**
|
||||
* Name of logfile
|
||||
* @var string
|
||||
*/
|
||||
private $logFile;
|
||||
|
||||
/**
|
||||
* session id
|
||||
* @var string
|
||||
*/
|
||||
private $sessid;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $token;
|
||||
|
||||
/**
|
||||
* Name of statusfile
|
||||
* @var string
|
||||
*/
|
||||
private $statusFile;
|
||||
|
||||
/**
|
||||
* Name of temporary directory, to here extract the backup tarball
|
||||
* @var string
|
||||
*/
|
||||
private $tmpDir;
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
// private $loglevel = 'warn';
|
||||
public $loglevel = 'warn';
|
||||
// public $loglevel = 'debug';
|
||||
|
||||
/**
|
||||
* @var GreenBox
|
||||
*/
|
||||
private $gb;
|
||||
|
||||
private $ACCESS_TYPE = 'restore';
|
||||
|
||||
/**
|
||||
* @param GreenBox $gb
|
||||
* greenbox object reference
|
||||
*/
|
||||
public function __construct(&$gb)
|
||||
{
|
||||
global $CC_CONFIG;
|
||||
$this->gb =& $gb;
|
||||
$this->token = null;
|
||||
$this->logFile = $CC_CONFIG['bufferDir'].'/'.$this->ACCESS_TYPE.'.log';
|
||||
if ($this->loglevel == 'debug') {
|
||||
$this->addLogItem("-I- ".date("Ymd-H:i:s")." construct\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Call asyncronously the restore procedure. Restore from backup.
|
||||
*
|
||||
* @param string $sessid
|
||||
* session id
|
||||
* @param string $backup_file
|
||||
* path of the backup file
|
||||
* @return array
|
||||
* hasharray with field:
|
||||
* token string: backup token
|
||||
*/
|
||||
function openRestore($sessid, $backup_file)
|
||||
{
|
||||
if ($this->loglevel=='debug') {
|
||||
$this->addLogItem("-I-".date("Ymd-H:i:s")." doRestore - sessid:$sessid\n");
|
||||
}
|
||||
$this->sessid = $sessid;
|
||||
|
||||
// generate token
|
||||
$this->token = StoredFile::CreateGunid();
|
||||
|
||||
// status file -> working
|
||||
$this->setEnviroment();
|
||||
file_put_contents($this->statusFile, 'working');
|
||||
|
||||
//call the restore script in background
|
||||
$command = dirname(__FILE__).'/../bin/restore.php';
|
||||
$runLog = "/dev/null";
|
||||
$params = "{$backup_file} {$this->statusFile} {$this->token} {$sessid}>> $runLog &";
|
||||
$ret = system("$command $params", $st);
|
||||
if ($this->loglevel=='debug') {
|
||||
$this->addLogItem("-I-".date("Ymd-H:i:s")." restore.php call: $st/$ret\n");
|
||||
}
|
||||
|
||||
return array('token'=>$this->token);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check the status of restore
|
||||
*
|
||||
* @param string $token
|
||||
* @return array
|
||||
* hasharray with field:
|
||||
* status : string - susccess | working | fault
|
||||
* faultString : string - description of fault
|
||||
* token : stirng - backup token
|
||||
* url : string - access url
|
||||
* tmpfile : string - access filename
|
||||
*/
|
||||
function checkRestore($token)
|
||||
{
|
||||
if ($this->loglevel == 'debug') {
|
||||
$this->addLogItem("-I- ".date("Ymd-H:i:s")." checkBackup - token:$token\n");
|
||||
}
|
||||
$this->token = $token;
|
||||
$this->setEnviroment();
|
||||
if (is_file($this->statusFile)) {
|
||||
$r = array();
|
||||
$stat = file_get_contents($this->statusFile);
|
||||
if (strpos($stat,'fault|') !== false) {
|
||||
list($stat,$message) = explode('|',$stat);
|
||||
}
|
||||
$r['status'] = $stat;
|
||||
if ($stat=='fault') {
|
||||
$r['faultString'] = $message;
|
||||
} else {
|
||||
$r['faultString'] = '';
|
||||
}
|
||||
return $r;
|
||||
} else {
|
||||
return PEAR::raiseError('Restore::checkRestore: invalid token!');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check the status of restore.
|
||||
*
|
||||
* @param string $token
|
||||
* @return array
|
||||
* hasharray with field:
|
||||
* status : boolean - is success
|
||||
*/
|
||||
function closeRestore($token)
|
||||
{
|
||||
if ($this->loglevel=='debug') {
|
||||
$this->addLogItem("-I- ".date("Ymd-H:i:s")." checkBackup - token:$token\n");
|
||||
}
|
||||
$this->token = $token;
|
||||
$this->setEnviroment();
|
||||
$this->rRmDir($this->tmpDir);
|
||||
unlink($this->statusFile);
|
||||
return array("status" => !is_file($this->statusFile));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Do restore in background
|
||||
*
|
||||
* this function is called from the asyncron commandline script
|
||||
* ../bin/restore.php
|
||||
*
|
||||
* @param string $backupfile
|
||||
* path of backupfile
|
||||
* @param string $token
|
||||
* restore token
|
||||
* @param string $sessid
|
||||
* session id
|
||||
*/
|
||||
function startRestore($backupfile, $token, $sessid)
|
||||
{
|
||||
if ($this->loglevel=='debug') {
|
||||
$this->addLogItem("-I- ".date("Ymd-H:i:s")." startRestore - bufile:$backupfile | token:$token\n");
|
||||
}
|
||||
$this->token = $token;
|
||||
$this->sessid = $sessid;
|
||||
$this->setEnviroment();
|
||||
|
||||
// extract tarball
|
||||
$command = 'tar -xf '.$backupfile .' --directory '.$this->tmpDir;
|
||||
$res = system($command);
|
||||
//$this->addLogItem('command: '.$command."\n");
|
||||
//$this->addLogItem('res: '.$res."\n");
|
||||
|
||||
//simple check of archive format
|
||||
if (is_dir($this->tmpDir.'audioClip/') &&
|
||||
is_dir($this->tmpDir.'meta-inf/') &&
|
||||
is_dir($this->tmpDir.'playlist/')) {
|
||||
//search metafiles
|
||||
$this->metafiles = $this->getMetaFiles();
|
||||
#$this->addLogItem('metafiles:'.print_r($this->metafiles,true));
|
||||
//add to storage server
|
||||
foreach ($this->metafiles as $info) {
|
||||
$r = $this->addFileToStorage($info['file'],$info['type'],$info['id']);
|
||||
if (PEAR::isError($r)) {
|
||||
$this->addLogItem("-E- ".date("Ymd-H:i:s").
|
||||
" startRestore - addFileToStorage \n".
|
||||
"(".$put->getMessage()."/".$put->getUserInfo().")\n"
|
||||
);
|
||||
file_put_contents($this->statusFile, 'fault|'.$put->getMessage()."/".$put->getUserInfo());
|
||||
return;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$this->addLogItem("-E- ".date("Ymd-H:i:s")." startRestore - invalid archive format\n");
|
||||
file_put_contents($this->statusFile, 'fault|invalid archive format');
|
||||
return;
|
||||
}
|
||||
file_put_contents($this->statusFile, 'success');
|
||||
// unlink($backupfile);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the metafiles.
|
||||
*
|
||||
* @return array
|
||||
* array of hasharray with field:
|
||||
* file : string - metafile path
|
||||
* type : stirng - audioClip | playlist
|
||||
* id : string - the backuped gunid
|
||||
*/
|
||||
function getMetaFiles()
|
||||
{
|
||||
if ($this->loglevel=='debug') {
|
||||
$this->addLogItem("-I- ".date("Ymd-H:i:s")." getMetaFiles - tmpDir:{$this->tmpDir}\n");
|
||||
}
|
||||
$audioclips = scandir($this->tmpDir.'audioClip/');
|
||||
$playlists = scandir($this->tmpDir.'playlist/');
|
||||
for ($i = 0; $i < count($audioclips); $i++) {
|
||||
if (strpos($audioclips[$i],'xml')!==false)
|
||||
$r[] = array('file' => $this->tmpDir.'audioClip/'.$audioclips[$i],
|
||||
'type' => 'audioClip',
|
||||
'id' => str_replace('.xml','',$audioclips[$i]));
|
||||
}
|
||||
for ($i = 0; $i < count($playlists); $i++) {
|
||||
if (strpos($playlists[$i],'xml') !== false)
|
||||
$r[] = array('file' => $this->tmpDir.'playlist/'.$playlists[$i],
|
||||
'type' => 'playlist',
|
||||
'id' => str_replace('.xml','',$playlists[$i]));
|
||||
}
|
||||
return $r;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add the file to the storage server.
|
||||
*
|
||||
* @param string $file
|
||||
* path of metafile
|
||||
* @param string $type
|
||||
* restore token
|
||||
* @param string $sessid
|
||||
* session id
|
||||
*
|
||||
* @return mixed
|
||||
* true if success or PEAR_error
|
||||
*/
|
||||
// function addFileToStorage($file,$type,$gunid)
|
||||
// {
|
||||
// if ($this->loglevel=='debug') {
|
||||
// $this->addLogItem("-I- ".date("Ymd-H:i:s")." addFileToStorage - file:$file | type:$type | id:$gunid\n");
|
||||
// }
|
||||
// require_once("XmlParser.php");
|
||||
// $tree = XmlParser::parse($file);
|
||||
// $mediaFileLP = str_replace('.xml','',$file);
|
||||
// $mediaFileLP = ($type=='audioClip' && is_file($mediaFileLP))?$mediaFileLP:'';
|
||||
// $ex = $this->gb->existsFile($this->sessid,$gunid);
|
||||
// if (PEAR::isError($ex)) {
|
||||
// $this->addLogItem("-E- ".date("Ymd-H:i:s").
|
||||
// " addFileToStorage - existsFile($gunid) ".
|
||||
// "(".$ex->getMessage()."/".$ex->getUserInfo().")\n"
|
||||
// );
|
||||
// }
|
||||
// if (!PEAR::isError($ex) && $ex) { // file is exists in storage server
|
||||
// //replace it
|
||||
// $id = BasicStor::IdFromGunid($gunid);
|
||||
// $replace = $this->gb->replaceFile(
|
||||
// $id, # id int, virt.file's local id
|
||||
// $mediaFileLP, # mediaFileLP string, local path of media file
|
||||
// $file, # mdataFileLP string, local path of metadata file
|
||||
// $this->sessid); # sessid string, session id
|
||||
// if (PEAR::isError($replace)) {
|
||||
// $this->addLogItem("-E- ".date("Ymd-H:i:s").
|
||||
// " addFileToStorage - replaceFile Error ".
|
||||
// "(".$replace->getMessage()."/".$replace->getUserInfo().")\n"
|
||||
// );
|
||||
// file_put_contents($this->statusFile, 'fault|'.$replace->getMessage()."/".$replace->getUserInfo());
|
||||
// return $replace;
|
||||
// }
|
||||
// #$this->addLogItem("replace it \n");
|
||||
// } else {
|
||||
// // add as new
|
||||
// $name = $tree->children[0]->children[0]->content;
|
||||
// if (empty($name)) {
|
||||
// $name = $tree->attrs['title']->val;
|
||||
// }
|
||||
// if (empty($name)) {
|
||||
// $name = '???';
|
||||
// }
|
||||
// if ($this->loglevel=='debug') {
|
||||
// $this->addLogItem("-I- ".date("Ymd-H:i:s")." putFile\n".
|
||||
// "$name, $mediaFileLP, $file, {$this->sessid}, $gunid, $type \n"
|
||||
// );
|
||||
// }
|
||||
// $values = array(
|
||||
// "filename" => $name,
|
||||
// "filepath" => $mediaFileLP,
|
||||
// "metadata" => $file,
|
||||
// "gunid" => $gunid,
|
||||
// "filetype" => $type
|
||||
// );
|
||||
// $put = $this->gb->putFile($values, $this->sessid);
|
||||
// //$this->addLogItem("add as new \n");
|
||||
// if (PEAR::isError($put)) {
|
||||
// $this->addLogItem("-E- ".date("Ymd-H:i:s").
|
||||
// " addFileToStorage - putFile Error ".
|
||||
// "(".$put->getMessage()."/".$put->getUserInfo().")\n"
|
||||
// ."\n---\n".file_get_contents($file)."\n---\n"
|
||||
// );
|
||||
// file_put_contents($this->statusFile, 'fault|'.$put->getMessage()."/".$put->getUserInfo());
|
||||
// //$this->addLogItem("Error Object: ".print_r($put,true)."\n");
|
||||
// return $put;
|
||||
// }
|
||||
// }
|
||||
// $ac = StoredFile::RecallByGunid($gunid);
|
||||
// if (is_null($ac) || PEAR::isError($ac)) {
|
||||
// return $ac;
|
||||
// }
|
||||
// $res = $ac->setState('ready');
|
||||
// if (PEAR::isError($res)) {
|
||||
// return $res;
|
||||
// }
|
||||
// return true;
|
||||
// }
|
||||
|
||||
|
||||
/**
|
||||
* Figure out the environment to the backup.
|
||||
*
|
||||
*/
|
||||
function setEnviroment()
|
||||
{
|
||||
global $CC_CONFIG;
|
||||
if ($this->loglevel=='debug') {
|
||||
$this->addLogItem("-I- ".date("Ymd-H:i:s")." setEnviroment\n");
|
||||
}
|
||||
$this->statusFile = $CC_CONFIG['accessDir'].'/'.$this->token.'.status';
|
||||
$this->tmpDir = '/tmp/ls_restore/'.$this->token.'/';
|
||||
$this->rMkDir($this->tmpDir);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add a line to the logfile.
|
||||
*
|
||||
* @param string $item
|
||||
* the new row of log file
|
||||
*/
|
||||
function addLogItem($item)
|
||||
{
|
||||
$f = fopen ($this->logFile,'a');
|
||||
flock($f,LOCK_SH);
|
||||
fwrite($f,$item);
|
||||
flock($f,LOCK_UN);
|
||||
fclose($f);
|
||||
//echo file_get_contents($this->logFile)."<BR><BR>\n\n";
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Delete a directory recursive
|
||||
*
|
||||
* @param string $dirname
|
||||
* path of dir
|
||||
*
|
||||
* @return boolean
|
||||
* is success
|
||||
*/
|
||||
function rRmDir($dirname)
|
||||
{
|
||||
if (is_dir($dirname)) {
|
||||
$dir_handle = opendir($dirname);
|
||||
}
|
||||
while ($file = readdir($dir_handle)) {
|
||||
if ($file!="." && $file!="..") {
|
||||
if (!is_dir($dirname."/".$file)) {
|
||||
unlink ($dirname."/".$file);
|
||||
} else {
|
||||
Restore::rRmDir($dirname."/".$file);
|
||||
}
|
||||
}
|
||||
}
|
||||
closedir($dir_handle);
|
||||
rmdir($dirname);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create a directory recursive
|
||||
*
|
||||
* @param string $dirname
|
||||
* path of dir.
|
||||
* @param int $mode
|
||||
* octal - rights of dir.
|
||||
* @param boolean $recursive
|
||||
* do it recursive.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
function rMkDir($dirname, $mode=0777, $recursive=true)
|
||||
{
|
||||
if (is_null($dirname) || $dirname === "" ) {
|
||||
return false;
|
||||
}
|
||||
if (is_dir($dirname) || $dirname === "/" ) {
|
||||
return true;
|
||||
}
|
||||
if ($this->rMkDir(dirname($dirname), $mode, $recursive)) {
|
||||
return mkdir($dirname, $mode);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
} // class Restore
|
||||
?>
|
||||
425
application/models/Schedule.php
Normal file
425
application/models/Schedule.php
Normal file
@ -0,0 +1,425 @@
|
||||
<?php
|
||||
require_once("StoredFile.php");
|
||||
require_once("BasicStor.php");
|
||||
|
||||
class ScheduleGroup {
|
||||
|
||||
private $groupId;
|
||||
|
||||
public function __construct($p_groupId = null) {
|
||||
$this->groupId = $p_groupId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a date to an ID by stripping out all characters
|
||||
* and padding with zeros.
|
||||
*
|
||||
* @param string $p_dateStr
|
||||
*/
|
||||
public static function dateToId($p_dateStr) {
|
||||
$p_dateStr = str_replace(":", "", $p_dateStr);
|
||||
$p_dateStr = str_replace(" ", "", $p_dateStr);
|
||||
$p_dateStr = str_replace(".", "", $p_dateStr);
|
||||
$p_dateStr = str_replace("-", "", $p_dateStr);
|
||||
$p_dateStr = substr($p_dateStr, 0, 17);
|
||||
$p_dateStr = str_pad($p_dateStr, 17, "0");
|
||||
return $p_dateStr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the two times together, return the result.
|
||||
*
|
||||
* @param string $p_baseTime
|
||||
* Specified as YYYY-MM-DD HH:MM:SS
|
||||
*
|
||||
* @param string $p_addTime
|
||||
* Specified as HH:MM:SS.nnnnnn
|
||||
*
|
||||
* @return string
|
||||
* The end time, to the nearest second.
|
||||
*/
|
||||
// protected function calculateEndTime($p_startTime, $p_trackTime) {
|
||||
// $p_trackTime = substr($p_startTime, 0, );
|
||||
// $start = new DateTime();
|
||||
// $interval = new DateInterval()
|
||||
//
|
||||
// }
|
||||
|
||||
/**
|
||||
* Add a music clip or playlist to the schedule.
|
||||
*
|
||||
* @param $p_datetime
|
||||
* In the format YYYY-MM-DD HH:MM:SS.mmmmmm
|
||||
* @param $p_audioFileId
|
||||
* (optional, either this or $p_playlistId must be set) DB ID of the audio file
|
||||
* @param $p_playlistId
|
||||
* (optional, either this of $p_audioFileId must be set) DB ID of the playlist
|
||||
* @param $p_options
|
||||
* Does nothing at the moment.
|
||||
*
|
||||
* @return int|PEAR_Error
|
||||
* Return PEAR_Error if the item could not be added.
|
||||
* Error code 555 is a scheduling conflict.
|
||||
*/
|
||||
public function add($p_datetime, $p_audioFileId = null, $p_playlistId = null, $p_options = null) {
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
if (!is_null($p_audioFileId)) {
|
||||
// Schedule a single audio track
|
||||
|
||||
// Load existing track
|
||||
$track = StoredFile::Recall($p_audioFileId);
|
||||
if (is_null($track)) {
|
||||
return new PEAR_Error("Could not find audio track.");
|
||||
}
|
||||
|
||||
// Check if there are any conflicts with existing entries
|
||||
$metadata = $track->getMetadata();
|
||||
$length = trim($metadata["length"]);
|
||||
if (empty($length)) {
|
||||
return new PEAR_Error("Length is empty.");
|
||||
}
|
||||
if (!Schedule::isScheduleEmptyInRange($p_datetime, $length)) {
|
||||
return new PEAR_Error("Schedule conflict.", 555);
|
||||
}
|
||||
|
||||
// Insert into the table
|
||||
$this->groupId = $CC_DBC->GetOne("SELECT nextval('schedule_group_id_seq')");
|
||||
$id = $this->dateToId($p_datetime);
|
||||
$sql = "INSERT INTO ".$CC_CONFIG["scheduleTable"]
|
||||
." (id, playlist_id, starts, ends, clip_length, group_id, file_id)"
|
||||
." VALUES ($id, 0, TIMESTAMP '$p_datetime', "
|
||||
." (TIMESTAMP '$p_datetime' + INTERVAL '$length'),"
|
||||
." '$length',"
|
||||
." {$this->groupId}, $p_audioFileId)";
|
||||
$result = $CC_DBC->query($sql);
|
||||
if (PEAR::isError($result)) {
|
||||
var_dump($sql);
|
||||
return $result;
|
||||
}
|
||||
return $this->groupId;
|
||||
|
||||
} elseif (!is_null($p_playlistId)){
|
||||
// Schedule a whole playlist
|
||||
|
||||
// Load existing playlist
|
||||
$playlist = Playlist::Recall($p_playlistId);
|
||||
if (is_null($playlist)) {
|
||||
return new PEAR_Error("Could not find playlist.");
|
||||
}
|
||||
|
||||
// Check if there are any conflicts with existing entries
|
||||
$length = trim($playlist->getLength());
|
||||
if (empty($length)) {
|
||||
return new PEAR_Error("Length is empty.");
|
||||
}
|
||||
if (!Schedule::isScheduleEmptyInRange($p_datetime, $length)) {
|
||||
return new PEAR_Error("Schedule conflict.", 555);
|
||||
}
|
||||
|
||||
// Insert all items into the schedule
|
||||
$this->groupId = $CC_DBC->GetOne("SELECT nextval('schedule_group_id_seq')");
|
||||
$id = $this->dateToId($p_datetime);
|
||||
$itemStartTime = $p_datetime;
|
||||
|
||||
$plItems = $playlist->getContents();
|
||||
foreach ($plItems as $row) {
|
||||
$trackLength = $row["cliplength"];
|
||||
$sql = "INSERT INTO ".$CC_CONFIG["scheduleTable"]
|
||||
." (id, playlist_id, starts, ends, group_id, file_id,"
|
||||
." clip_length, cue_in, cue_out, fade_in, fade_out)"
|
||||
." VALUES ($id, $p_playlistId, TIMESTAMP '$itemStartTime', "
|
||||
." (TIMESTAMP '$itemStartTime' + INTERVAL '$trackLength'),"
|
||||
." '{$this->groupId}', '{$row['file_id']}', '$trackLength', '{$row['cuein']}',"
|
||||
." '{$row['cueout']}', '{$row['fadein']}','{$row['fadeout']}')";
|
||||
$result = $CC_DBC->query($sql);
|
||||
if (PEAR::isError($result)) {
|
||||
var_dump($sql);
|
||||
return $result;
|
||||
}
|
||||
$itemStartTime = $CC_DBC->getOne("SELECT TIMESTAMP '$itemStartTime' + INTERVAL '$trackLength'");
|
||||
$id = $this->dateToId($itemStartTime);
|
||||
}
|
||||
return $this->groupId;
|
||||
}
|
||||
}
|
||||
|
||||
public function addAfter($p_groupId, $p_audioFileId) {
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
// Get the end time for the given entry
|
||||
$sql = "SELECT ends FROM ".$CC_CONFIG["scheduleTable"]
|
||||
." WHERE group_id=$p_groupId";
|
||||
$startTime = $CC_DBC->GetOne($sql);
|
||||
return $this->add($startTime, $p_audioFileId);
|
||||
}
|
||||
|
||||
public function update() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the group from the schedule.
|
||||
* Note: does not check if it is in the past, you can remove anything.
|
||||
*
|
||||
* @return boolean
|
||||
* TRUE on success, false if there is no group ID defined.
|
||||
*/
|
||||
public function remove() {
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
if (is_null($this->groupId) || !is_numeric($this->groupId)) {
|
||||
return false;
|
||||
}
|
||||
$sql = "DELETE FROM ".$CC_CONFIG["scheduleTable"]
|
||||
." WHERE group_id = ".$this->groupId;
|
||||
|
||||
return $CC_DBC->query($sql);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the number of items in this group.
|
||||
* @return string
|
||||
*/
|
||||
public function count() {
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$sql = "SELECT COUNT(*) FROM {$CC_CONFIG['scheduleTable']}"
|
||||
." WHERE group_id={$this->groupId}";
|
||||
return $CC_DBC->GetOne($sql);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the list of items in this group as a 2D array.
|
||||
* @return array
|
||||
*/
|
||||
public function getItems() {
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$sql = "SELECT * FROM {$CC_CONFIG['scheduleTable']}"
|
||||
." WHERE group_id={$this->groupId}";
|
||||
return $CC_DBC->GetAll($sql);
|
||||
}
|
||||
|
||||
public function reschedule($toDateTime) {
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
// $sql = "UPDATE ".$CC_CONFIG["scheduleTable"]. " SET id=, starts=,ends="
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class Schedule {
|
||||
|
||||
function __construct() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Return true if there is nothing in the schedule for the given times.
|
||||
*
|
||||
* @param string $p_datetime
|
||||
* @param string $p_length
|
||||
*
|
||||
* @return boolean|PEAR_Error
|
||||
*/
|
||||
public static function isScheduleEmptyInRange($p_datetime, $p_length) {
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
if (empty($p_length)) {
|
||||
return new PEAR_Error("Schedule::isSchedulerEmptyInRange: param p_length is empty.");
|
||||
}
|
||||
$sql = "SELECT COUNT(*) FROM ".$CC_CONFIG["scheduleTable"]
|
||||
." WHERE (starts >= '$p_datetime') "
|
||||
." AND (ends <= (TIMESTAMP '$p_datetime' + INTERVAL '$p_length'))";
|
||||
//$_SESSION["debug"] = $sql;
|
||||
$count = $CC_DBC->GetOne($sql);
|
||||
return ($count == '0');
|
||||
}
|
||||
|
||||
// public function onAddTrackToPlaylist($playlistId, $audioTrackId) {
|
||||
//
|
||||
// }
|
||||
//
|
||||
// public function onRemoveTrackFromPlaylist($playlistId, $audioTrackId) {
|
||||
//
|
||||
// }
|
||||
|
||||
/**
|
||||
* Return TRUE if file is going to be played in the future.
|
||||
*
|
||||
* @param string $p_fileId
|
||||
*/
|
||||
public function IsFileScheduledInTheFuture($p_fileId)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$sql = "SELECT COUNT(*) FROM ".$CC_CONFIG["scheduleTable"]
|
||||
." WHERE file_id = {$p_fileId} AND starts > NOW()";
|
||||
$count = $CC_DBC->GetOne($sql);
|
||||
if (is_numeric($count) && ($count != '0')) {
|
||||
return TRUE;
|
||||
} else {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns array indexed numberically of:
|
||||
* "playlistId"/"playlist_id" (aliases to the same thing)
|
||||
* "start"/"starts" (aliases to the same thing) as YYYY-MM-DD HH:MM:SS.nnnnnn
|
||||
* "end"/"ends" (aliases to the same thing) as YYYY-MM-DD HH:MM:SS.nnnnnn
|
||||
* "group_id"/"id" (aliases to the same thing)
|
||||
* "clip_length" (for playlists only, this is the length of the entire playlist)
|
||||
* "name" (playlist only)
|
||||
* "creator" (playlist only)
|
||||
* "file_id" (audioclip only)
|
||||
* "count" (number of items in the playlist, always 1 for audioclips.
|
||||
* Note that playlists with one item will also have count = 1.
|
||||
*
|
||||
* @param string $p_fromDateTime
|
||||
* In the format YYYY-MM-DD HH:MM:SS.nnnnnn
|
||||
* @param string $p_toDateTime
|
||||
* In the format YYYY-MM-DD HH:MM:SS.nnnnnn
|
||||
* @param boolean $p_playlistsOnly
|
||||
* Retreive playlists as a single item.
|
||||
* @return array
|
||||
* Returns empty array if nothing found
|
||||
*/
|
||||
public static function GetItems($p_fromDateTime, $p_toDateTime, $p_playlistsOnly = true) {
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$rows = array();
|
||||
if (!$p_playlistsOnly) {
|
||||
$sql = "SELECT * FROM ".$CC_CONFIG["scheduleTable"]
|
||||
." WHERE (starts >= TIMESTAMP '$p_fromDateTime') "
|
||||
." AND (ends <= TIMESTAMP '$p_toDateTime')";
|
||||
$rows = $CC_DBC->GetAll($sql);
|
||||
foreach ($rows as &$row) {
|
||||
$row["count"] = "1";
|
||||
$row["playlistId"] = $row["playlist_id"];
|
||||
$row["start"] = $row["starts"];
|
||||
$row["end"] = $row["ends"];
|
||||
$row["id"] = $row["group_id"];
|
||||
}
|
||||
} else {
|
||||
$sql = "SELECT MIN(name) AS name, MIN(creator) AS creator, group_id, "
|
||||
." SUM(clip_length) AS clip_length,"
|
||||
." MIN(file_id) AS file_id, COUNT(*) as count,"
|
||||
." MIN(playlist_id) AS playlist_id, MIN(starts) AS starts, MAX(ends) AS ends"
|
||||
." FROM ".$CC_CONFIG["scheduleTable"]
|
||||
." LEFT JOIN ".$CC_CONFIG["playListTable"]." ON playlist_id = ".$CC_CONFIG["playListTable"].".id"
|
||||
." WHERE (starts >= TIMESTAMP '$p_fromDateTime') AND (ends <= TIMESTAMP '$p_toDateTime')"
|
||||
." GROUP BY group_id"
|
||||
." ORDER BY starts";
|
||||
//var_dump($sql);
|
||||
$rows = $CC_DBC->GetAll($sql);
|
||||
if (!PEAR::isError($rows)) {
|
||||
foreach ($rows as &$row) {
|
||||
$row["playlistId"] = $row["playlist_id"];
|
||||
$row["start"] = $row["starts"];
|
||||
$row["end"] = $row["ends"];
|
||||
$row["id"] = $row["group_id"];
|
||||
}
|
||||
}
|
||||
}
|
||||
return $rows;
|
||||
}
|
||||
|
||||
public function getSchedulerTime() {
|
||||
|
||||
}
|
||||
|
||||
public function getCurrentlyPlaying() {
|
||||
|
||||
}
|
||||
|
||||
public function getNextItem($nextCount = 1) {
|
||||
|
||||
}
|
||||
|
||||
public function getStatus() {
|
||||
|
||||
}
|
||||
|
||||
private static function CcTimeToPypoTime($p_time) {
|
||||
$p_time = substr($p_time, 0, 19);
|
||||
$p_time = str_replace(" ", "-", $p_time);
|
||||
$p_time = str_replace(":", "-", $p_time);
|
||||
return $p_time;
|
||||
}
|
||||
|
||||
private static function PypoTimeToCcTime($p_time) {
|
||||
$t = explode("-", $p_time);
|
||||
return $t[0]."-".$t[1]."-".$t[2]." ".$t[3].":".$t[4].":00";
|
||||
}
|
||||
|
||||
/**
|
||||
* Export the schedule in json formatted for pypo (the liquidsoap scheduler)
|
||||
*
|
||||
* @param string $range
|
||||
* In the format "YYYY-MM-DD HH:mm:ss"
|
||||
* @param string $source
|
||||
* In the format "YYYY-MM-DD HH:mm:ss"
|
||||
*/
|
||||
public static function ExportRangeAsJson($p_fromDateTime, $p_toDateTime)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$range_start = Schedule::PypoTimeToCcTime($p_fromDateTime);
|
||||
$range_end = Schedule::PypoTimeToCcTime($p_toDateTime);
|
||||
$range_dt = array('start' => $range_start, 'end' => $range_end);
|
||||
//var_dump($range_dt);
|
||||
|
||||
// Scheduler wants everything in a playlist
|
||||
$data = Schedule::GetItems($range_start, $range_end, true);
|
||||
//echo "<pre>";var_dump($data);
|
||||
$playlists = array();
|
||||
|
||||
if (is_array($data) && count($data) > 0)
|
||||
{
|
||||
foreach ($data as $dx)
|
||||
{
|
||||
// Is this the first item in the playlist?
|
||||
$start = $dx['start'];
|
||||
// chop off subseconds
|
||||
$start = substr($start, 0, 19);
|
||||
|
||||
// Start time is the array key, needs to be in the format "YYYY-MM-DD-HH-mm-ss"
|
||||
$pkey = Schedule::CcTimeToPypoTime($start);
|
||||
$timestamp = strtotime($start);
|
||||
$playlists[$pkey]['source'] = "PLAYLIST";
|
||||
$playlists[$pkey]['x_ident'] = $dx["playlist_id"];
|
||||
$playlists[$pkey]['subtype'] = '1'; // Just needs to be between 1 and 4 inclusive
|
||||
$playlists[$pkey]['timestamp'] = $timestamp;
|
||||
$playlists[$pkey]['duration'] = $dx['clip_length'];
|
||||
$playlists[$pkey]['played'] = '0';
|
||||
$playlists[$pkey]['schedule_id'] = $dx['group_id'];
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($playlists as &$playlist)
|
||||
{
|
||||
$scheduleGroup = new ScheduleGroup($playlist["schedule_id"]);
|
||||
$items = $scheduleGroup->getItems();
|
||||
$medias = array();
|
||||
$playlist['subtype'] = '1';
|
||||
foreach ($items as $item)
|
||||
{
|
||||
$storedFile = StoredFile::Recall($item["file_id"]);
|
||||
$uri = $storedFile->getFileUrl();
|
||||
$medias[] = array(
|
||||
'id' => $storedFile->getGunid(), //$item["file_id"],
|
||||
'uri' => $uri,
|
||||
'fade_in' => $item["fade_in"],
|
||||
'fade_out' => $item["fade_out"],
|
||||
'fade_cross' => 0,
|
||||
'cue_in' => $item["cue_in"],
|
||||
'cue_out' => $item["cue_out"],
|
||||
);
|
||||
}
|
||||
$playlist['medias'] = $medias;
|
||||
}
|
||||
|
||||
$result = array();
|
||||
$result['status'] = array('range' => $range_dt, 'version' => 0.2);
|
||||
$result['playlists'] = $playlists;
|
||||
$result['check'] = 1;
|
||||
|
||||
print json_encode($result);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
||||
123
application/models/Shows.php
Normal file
123
application/models/Shows.php
Normal file
@ -0,0 +1,123 @@
|
||||
<?php
|
||||
|
||||
class Show {
|
||||
|
||||
private $_userRole;
|
||||
|
||||
public function __construct($userType='G')
|
||||
{
|
||||
$this->_userRole = $userType;
|
||||
|
||||
}
|
||||
|
||||
private function makeFullCalendarEvent($show, $date, $options=array()) {
|
||||
|
||||
$start = $date."T".$show["start_time"];
|
||||
$end = $date."T".$show["end_time"];
|
||||
|
||||
$event = array(
|
||||
"id" => $show["show_id"],
|
||||
"title" => $show["name"],
|
||||
"start" => $start,
|
||||
"end" => $end,
|
||||
"allDay" => false,
|
||||
"description" => $show["description"]
|
||||
);
|
||||
|
||||
foreach($options as $key=>$value) {
|
||||
$event[$key] = $value;
|
||||
}
|
||||
|
||||
if($this->_userRole === "A") {
|
||||
$event["editable"] = true;
|
||||
}
|
||||
|
||||
return $event;
|
||||
}
|
||||
|
||||
public function addShow() {
|
||||
|
||||
$sql = 'INSERT INTO cc_show
|
||||
("name", "first_show", "last_show", "start_time", "end_time",
|
||||
"repeats", "day", "description", "show_id")
|
||||
VALUES ()';
|
||||
|
||||
}
|
||||
|
||||
public function getShows($start=NULL, $end=NULL, $weekday=NULL) {
|
||||
global $CC_DBC;
|
||||
|
||||
$sql;
|
||||
|
||||
$sql_gen = "SELECT * FROM cc_show";
|
||||
$sql = $sql_gen;
|
||||
|
||||
if(!is_null($start) && !is_null($end)) {
|
||||
$sql_range = "(first_show < '{$start}' AND last_show IS NULL)
|
||||
OR (first_show >= '{$start}' AND first_show < '{$end}')
|
||||
OR (last_show >= '{$start}' AND last_show < '{$end}')
|
||||
OR (first_show < '{$start}' AND last_show >= '{$end}')";
|
||||
|
||||
$sql = $sql_gen ." WHERE ". $sql_range;
|
||||
}
|
||||
if(!is_null($weekday)){
|
||||
$sql_day = "day = {$weekday}";
|
||||
|
||||
$sql = $sql_gen ." WHERE (". $sql_day ." AND (". $sql_range ."))";
|
||||
}
|
||||
|
||||
return $CC_DBC->GetAll($sql);
|
||||
}
|
||||
|
||||
public function getFullCalendarEvents($start, $end, $weekday=NULL) {
|
||||
global $CC_DBC;
|
||||
$shows = array();
|
||||
|
||||
$res = $this->getShows($start, $end, $weekday);
|
||||
|
||||
foreach($res as $row) {
|
||||
|
||||
if(!is_null($start)) {
|
||||
|
||||
$timeDiff = "SELECT date '{$start}' - date '{$row["first_show"]}' as diff";
|
||||
$diff = $CC_DBC->GetOne($timeDiff);
|
||||
|
||||
if($diff > 0) {
|
||||
|
||||
$add = ($diff % 7 === 0) ? $diff : $diff + (7 - $diff % 7);
|
||||
|
||||
$new = "SELECT date '{$row["first_show"]}' + integer '{$add}'";
|
||||
$newDate = $CC_DBC->GetOne($new);
|
||||
}
|
||||
else {
|
||||
$newDate = $row["first_show"];
|
||||
}
|
||||
|
||||
$shows[] = $this->makeFullCalendarEvent($row, $newDate);
|
||||
|
||||
$end_epoch = strtotime($end);
|
||||
|
||||
if($row["repeats"]) {
|
||||
|
||||
while(true) {
|
||||
|
||||
$diff = "SELECT date '{$newDate}' + integer '7'";
|
||||
$repeatDate = $CC_DBC->GetOne($diff);
|
||||
$repeat_epoch = strtotime($repeatDate);
|
||||
|
||||
if ($repeat_epoch < $end_epoch ) {
|
||||
$shows[] = $this->makeFullCalendarEvent($row, $repeatDate);
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
|
||||
$newDate = $repeatDate;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $shows;
|
||||
}
|
||||
}
|
||||
313
application/models/SmilPlaylist.php
Normal file
313
application/models/SmilPlaylist.php
Normal file
@ -0,0 +1,313 @@
|
||||
<?
|
||||
define('INDCH', ' ');
|
||||
|
||||
require_once("XmlParser.php");
|
||||
|
||||
/**
|
||||
* SmilPlaylist class
|
||||
*
|
||||
* @package Campcaster
|
||||
* @subpackage StorageServer
|
||||
* @copyright 2010 Sourcefabric O.P.S.
|
||||
* @license http://www.gnu.org/licenses/gpl.txt
|
||||
*/
|
||||
class SmilPlaylist {
|
||||
|
||||
/**
|
||||
* Parse SMIL file or string
|
||||
*
|
||||
* @param string $data
|
||||
* local path to SMIL file or SMIL string
|
||||
* @param string $loc
|
||||
* location: 'file'|'string'
|
||||
* @return array
|
||||
* reference, parse result tree (or PEAR::error)
|
||||
*/
|
||||
private static function &parse($data='', $loc='file')
|
||||
{
|
||||
return XmlParser::parse($data, $loc);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Import SMIL file to storage
|
||||
*
|
||||
* @param GreenBox $gb
|
||||
* reference to GreenBox object
|
||||
* @param string $aPath
|
||||
* absolute path part of imported file (e.g. /home/user/campcaster)
|
||||
* @param string $rPath
|
||||
* relative path/filename part of imported file
|
||||
* (e.g. playlists/playlist_1.smil)
|
||||
* @param array $gunids
|
||||
* hash relation from filenames to gunids
|
||||
* @param string $plid
|
||||
* playlist gunid
|
||||
* @param int $subjid
|
||||
* local subject (user) id (id of user doing the import)
|
||||
* @return Playlist
|
||||
*/
|
||||
public static function &import(&$gb, $aPath, $rPath, &$gunids, $plid, $subjid=NULL)
|
||||
{
|
||||
$parr = compact('subjid', 'aPath', 'plid', 'rPath');
|
||||
$path = realpath("$aPath/$rPath");
|
||||
if (FALSE === $path) {
|
||||
return PEAR::raiseError(
|
||||
"SmilPlaylist::import: file doesn't exist ($aPath/$rPath)"
|
||||
);
|
||||
}
|
||||
$lspl = SmilPlaylist::convert2lspl($gb, $path, $gunids, $parr);
|
||||
if (PEAR::isError($lspl)) {
|
||||
return $lspl;
|
||||
}
|
||||
require_once("Playlist.php");
|
||||
$pl =& Playlist::create($gb, $plid, "imported_SMIL");
|
||||
if (PEAR::isError($pl)) {
|
||||
return $pl;
|
||||
}
|
||||
$r = $pl->lock($gb, $subjid);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$r = $pl->setMetadata($lspl, 'string', 'playlist');
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$r = $pl->unlock($gb);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
return $pl;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Import SMIL file to storage.
|
||||
*
|
||||
* @param GreenBox $gb
|
||||
* @param string $data
|
||||
* local path to SMIL file
|
||||
* @param hasharray $gunids
|
||||
* hash relation from filenames to gunids
|
||||
* @param array $parr
|
||||
* array of subjid, aPath, plid, rPath
|
||||
* @return string
|
||||
* XML of playlist in Campcaster playlist format
|
||||
*/
|
||||
public static function convert2lspl(&$gb, $data, &$gunids, $parr)
|
||||
{
|
||||
extract($parr);
|
||||
$tree = SmilPlaylist::parse($data);
|
||||
if (PEAR::isError($tree)) {
|
||||
return $tree;
|
||||
}
|
||||
if ($tree->name != 'smil') {
|
||||
return PEAR::raiseError("SmilPlaylist::parse: smil tag expected");
|
||||
}
|
||||
if (isset($tree->children[1])) {
|
||||
return PEAR::raiseError(sprintf(
|
||||
"SmilPlaylist::parse: unexpected tag %s in tag smil",
|
||||
$tree->children[1]->name
|
||||
));
|
||||
}
|
||||
$res = SmilPlaylistBodyElement::convert2lspl(
|
||||
$gb, $tree->children[0], &$gunids, $parr);
|
||||
return $res;
|
||||
}
|
||||
|
||||
} // SmilPlaylist
|
||||
|
||||
|
||||
/**
|
||||
* @package Campcaster
|
||||
* @subpackage StorageServer
|
||||
* @copyright 2010 Sourcefabric O.P.S.
|
||||
* @license http://www.gnu.org/licenses/gpl.txt
|
||||
*/
|
||||
class SmilPlaylistBodyElement {
|
||||
|
||||
public static function convert2lspl(&$gb, &$tree, &$gunids, $parr, $ind='')
|
||||
{
|
||||
extract($parr);
|
||||
$ind2 = $ind.INDCH;
|
||||
if ($tree->name != 'body') {
|
||||
return PEAR::raiseError("SmilPlaylist::parse: body tag expected");
|
||||
}
|
||||
if (isset($tree->children[1])) {
|
||||
return PEAR::raiseError(sprintf(
|
||||
"SmilPlaylist::parse: unexpected tag %s in tag body",
|
||||
$tree->children[1]->name
|
||||
));
|
||||
}
|
||||
$res = SmilPlaylistParElement::convert2lspl(
|
||||
$gb, $tree->children[0], &$gunids, $parr, $ind2);
|
||||
if (PEAR::isError($res)) {
|
||||
return $res;
|
||||
}
|
||||
$title = basename($rPath);
|
||||
$playlength = '0';
|
||||
$res = "$ind<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n".
|
||||
"$ind<playlist id=\"$plid\" playlength=\"$playlength\" title=\"$title\">\n".
|
||||
"$ind2<metadata/>\n".
|
||||
"$res".
|
||||
"$ind</playlist>\n";
|
||||
return $res;
|
||||
}
|
||||
|
||||
} // class SmilPlaylistBodyElement
|
||||
|
||||
|
||||
/**
|
||||
* @package Campcaster
|
||||
* @subpackage StorageServer
|
||||
* @copyright 2010 Sourcefabric O.P.S.
|
||||
* @license http://www.gnu.org/licenses/gpl.txt
|
||||
*/
|
||||
class SmilPlaylistParElement {
|
||||
|
||||
public static function convert2lspl(&$gb, &$tree, &$gunids, $parr, $ind='')
|
||||
{
|
||||
extract($parr);
|
||||
if ($tree->name != 'par') {
|
||||
return PEAR::raiseError("SmilPlaylist::parse: par tag expected");
|
||||
}
|
||||
$res = '';
|
||||
foreach ($tree->children as $i => $ch) {
|
||||
$ch =& $tree->children[$i];
|
||||
$r = SmilPlaylistAudioElement::convert2lspl($gb, $ch, &$gunids, $parr, $ind.INDCH);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$res .= $r;
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @package Campcaster
|
||||
* @subpackage StorageServer
|
||||
* @copyright 2010 Sourcefabric O.P.S.
|
||||
* @license http://www.gnu.org/licenses/gpl.txt
|
||||
*/
|
||||
class SmilPlaylistAudioElement {
|
||||
public static function convert2lspl(&$gb, &$tree, &$gunids, $parr, $ind='')
|
||||
{
|
||||
extract($parr);
|
||||
$uri = $tree->attrs['src']->val;
|
||||
$gunid = ( isset($gunids[basename($uri)]) ? $gunids[basename($uri)] : NULL);
|
||||
$ind2 = $ind.INDCH;
|
||||
if ($tree->name != 'audio') {
|
||||
return PEAR::raiseError("SmilPlaylist::parse: audio tag expected");
|
||||
}
|
||||
if (isset($tree->children[2])) {
|
||||
return PEAR::raiseError(sprintf(
|
||||
"SmilPlaylist::parse: unexpected tag %s in tag audio",
|
||||
$tree->children[2]->name
|
||||
));
|
||||
}
|
||||
$res = ''; $fadeIn = 0; $fadeOut = 0;
|
||||
foreach ($tree->children as $i => $ch) {
|
||||
$ch =& $tree->children[$i];
|
||||
$r = SmilPlaylistAnimateElement::convert2lspl($gb, $ch, &$gunids, $parr, $ind2);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
switch ($r['type']) {
|
||||
case "fadeIn": $fadeIn = $r['val']; break;
|
||||
case "fadeOut": $fadeOut = $r['val']; break;
|
||||
}
|
||||
}
|
||||
if ($fadeIn > 0 || $fadeOut > 0) {
|
||||
$fiGunid = StoredFile::CreateGunid();
|
||||
$fadeIn = Playlist::secondsToPlaylistTime($fadeIn);
|
||||
$fadeOut = Playlist::secondsToPlaylistTime($fadeOut);
|
||||
$fInfo = "$ind2<fadeInfo id=\"$fiGunid\" fadeIn=\"$fadeIn\" fadeOut=\"$fadeOut\"/>\n";
|
||||
} else {
|
||||
$fInfo = '';
|
||||
}
|
||||
$plElGunid = StoredFile::CreateGunid();
|
||||
$acGunid = $gunid;
|
||||
$type = 'audioClip';
|
||||
if (preg_match("|\.([a-zA-Z0-9]+)$|", $uri, $va)) {
|
||||
switch (strtolower($ext = $va[1])) {
|
||||
case "lspl":
|
||||
case "xml":
|
||||
case "smil":
|
||||
case "m3u":
|
||||
$type = 'playlist';
|
||||
$acId = $gb->bsImportPlaylistRaw($gunid,
|
||||
$aPath, $uri, $ext, $gunids, $subjid);
|
||||
if (PEAR::isError($acId)) {
|
||||
return $r;
|
||||
}
|
||||
//break;
|
||||
default:
|
||||
$ac = StoredFile::RecallByGunid($gunid);
|
||||
if (is_null($ac) || PEAR::isError($ac)) {
|
||||
return $ac;
|
||||
}
|
||||
$r = $ac->md->getMetadataElement('dcterms:extent');
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$playlength = $r[0]['value'];
|
||||
}
|
||||
}
|
||||
|
||||
$title = basename($tree->attrs['src']->val);
|
||||
$offset = Playlist::secondsToPlaylistTime($tree->attrs['begin']->val);
|
||||
$clipStart = Playlist::secondsToPlaylistTime($tree->attrs['clipStart']->val);
|
||||
$clipEnd = Playlist::secondsToPlaylistTime($tree->attrs['clipEnd']->val);
|
||||
$clipLength = Playlist::secondsToPlaylistTime($tree->attrs['clipLength']->val);
|
||||
$res = "$ind<playlistElement id=\"$plElGunid\" relativeOffset=\"$offset\" clipStart=\"$clipStart\" clipEnd=\"$clipEnd\" clipLength=\"$clipLength\">\n".
|
||||
"$ind2<$type id=\"$acGunid\" playlength=\"$playlength\" title=\"$title\"/>\n".
|
||||
$fInfo.
|
||||
"$ind</playlistElement>\n";
|
||||
return $res;
|
||||
}
|
||||
} // class SmilPlaylistAudioElement
|
||||
|
||||
|
||||
/**
|
||||
* @package Campcaster
|
||||
* @subpackage StorageServer
|
||||
* @copyright 2010 Sourcefabric O.P.S.
|
||||
* @license http://www.gnu.org/licenses/gpl.txt
|
||||
*/
|
||||
class SmilPlaylistAnimateElement {
|
||||
|
||||
public static function convert2lspl(&$gb, &$tree, &$gunids, $parr, $ind='')
|
||||
{
|
||||
extract($parr);
|
||||
if ($tree->name != 'animate') {
|
||||
return PEAR::raiseError("SmilPlaylist::parse: animate tag expected");
|
||||
}
|
||||
if ($tree->attrs['attributeName']->val == 'soundLevel' &&
|
||||
$tree->attrs['from']->val == '0%' &&
|
||||
$tree->attrs['to']->val == '100%' &&
|
||||
$tree->attrs['calcMode']->val == 'linear' &&
|
||||
$tree->attrs['fill']->val == 'freeze' &&
|
||||
$tree->attrs['begin']->val == '0s' &&
|
||||
preg_match("|^([0-9.]+)s$|", $tree->attrs['end']->val, $va)
|
||||
) {
|
||||
return array('type'=>'fadeIn', 'val'=>intval($va[1]));
|
||||
}
|
||||
if ($tree->attrs['attributeName']->val == 'soundLevel' &&
|
||||
$tree->attrs['from']->val == '100%' &&
|
||||
$tree->attrs['to']->val == '0%' &&
|
||||
$tree->attrs['calcMode']->val == 'linear' &&
|
||||
$tree->attrs['fill']->val == 'freeze' &&
|
||||
preg_match("|^([0-9.]+)s$|", $tree->attrs['begin']->val, $vaBegin) &&
|
||||
preg_match("|^([0-9.]+)s$|", $tree->attrs['end']->val, $vaEnd)
|
||||
) {
|
||||
return array('type'=>'fadeOut', 'val'=>($vaEnd[1] - $vaBegin[1]));
|
||||
}
|
||||
return PEAR::raiseError(
|
||||
"SmilPlaylistAnimateElement::convert2lspl: animate parameters too general"
|
||||
);
|
||||
}
|
||||
} // class SmilPlaylistAnimateElement
|
||||
|
||||
?>
|
||||
1787
application/models/StoredFile.php
Normal file
1787
application/models/StoredFile.php
Normal file
File diff suppressed because it is too large
Load Diff
683
application/models/Subjects.php
Normal file
683
application/models/Subjects.php
Normal file
@ -0,0 +1,683 @@
|
||||
<?php
|
||||
define('ALIBERR_NOTGR', 20);
|
||||
define('ALIBERR_BADSMEMB', 21);
|
||||
|
||||
/**
|
||||
* Subj class
|
||||
*
|
||||
* users + groups
|
||||
* with "linearized recursive membership" ;)
|
||||
* (allow adding users to groups or groups to groups)
|
||||
*
|
||||
* @package Campcaster
|
||||
* @subpackage Alib
|
||||
* @copyright 2010 Sourcefabric O.P.S.
|
||||
* @license http://www.gnu.org/licenses/gpl.txt
|
||||
* @see ObjClasses
|
||||
* @see Alib
|
||||
*/
|
||||
class Subjects {
|
||||
|
||||
/* ======================================================= public methods */
|
||||
|
||||
/**
|
||||
* Add new subject (a.k.a. "user")
|
||||
*
|
||||
* @param string $p_login
|
||||
* @param string $p_pass
|
||||
* @param string $p_realname
|
||||
* @param boolean $p_passenc
|
||||
* password already encrypted if true
|
||||
* @return int|PEAR_Error
|
||||
*/
|
||||
public static function AddSubj($p_login, $p_pass=NULL, $p_realname='', $p_passenc=FALSE)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
if (!$p_login) {
|
||||
return $CC_DBC->raiseError("Subjects::AddSubj: empty login");
|
||||
}
|
||||
$id = $CC_DBC->nextId($CC_CONFIG['subjSequence']);
|
||||
if (PEAR::isError($id)) {
|
||||
return $id;
|
||||
}
|
||||
if (!is_null($p_pass) && !$p_passenc) {
|
||||
$p_pass = md5($p_pass);
|
||||
}
|
||||
$sql = "INSERT INTO ".$CC_CONFIG['subjTable']." (id, login, pass, type, realname)"
|
||||
." VALUES ($id, '$p_login', ".
|
||||
(is_null($p_pass) ? "'!', 'G'" : "'$p_pass', 'U'").",
|
||||
'$p_realname')";
|
||||
$r = $CC_DBC->query($sql);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
return $id;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Remove subject by uid or by login
|
||||
*
|
||||
* @param string $login
|
||||
* @param int $uid
|
||||
* @return boolean|PEAR_Error
|
||||
*/
|
||||
public static function RemoveSubj($login, $uid=NULL)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
if (is_null($uid)) {
|
||||
$uid = Subjects::GetSubjId($login);
|
||||
}
|
||||
if (PEAR::isError($uid)) {
|
||||
return $uid;
|
||||
}
|
||||
$sql = "DELETE FROM ".$CC_CONFIG['smembTable']
|
||||
." WHERE (uid='$uid' OR gid='$uid') AND mid is null";
|
||||
$r = $CC_DBC->query($sql);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$sql2 = "DELETE FROM ".$CC_CONFIG['subjTable']
|
||||
." WHERE login='$login'";
|
||||
$r = $CC_DBC->query($sql2);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
return Subjects::_rebuildRels();
|
||||
} // fn removeSubj
|
||||
|
||||
|
||||
/**
|
||||
* Check login and password
|
||||
*
|
||||
* @param string $login
|
||||
* @param string $pass
|
||||
* optional
|
||||
* @return boolean|int|PEAR_Error
|
||||
*/
|
||||
public static function Authenticate($login, $pass='')
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$cpass = md5($pass);
|
||||
$sql = "SELECT id FROM ".$CC_CONFIG['subjTable']
|
||||
." WHERE login='$login' AND pass='$cpass' AND type='U'";
|
||||
$id = $CC_DBC->getOne($sql);
|
||||
if (PEAR::isError($id)) {
|
||||
return $id;
|
||||
}
|
||||
return (is_null($id) ? FALSE : $id);
|
||||
} // fn authenticate
|
||||
|
||||
|
||||
/**
|
||||
* Set lastlogin or lastfail timestamp
|
||||
*
|
||||
* @param string $login
|
||||
* @param boolean $failed
|
||||
* true=> set lastfail, false=> set lastlogin
|
||||
* @return boolean|int|PEAR_Error
|
||||
*/
|
||||
public static function SetTimeStamp($login, $failed=FALSE)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$fld = ($failed ? 'lastfail' : 'lastlogin');
|
||||
$sql = "UPDATE ".$CC_CONFIG['subjTable']." SET $fld=now()"
|
||||
." WHERE login='$login'";
|
||||
$r = $CC_DBC->query($sql);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
return TRUE;
|
||||
} // fn setTimeStamp
|
||||
|
||||
|
||||
/**
|
||||
* Change user password
|
||||
*
|
||||
* @param string $login
|
||||
* @param string $oldpass
|
||||
* old password (optional for 'superuser mode')
|
||||
* @param string $pass
|
||||
* optional
|
||||
* @param boolean $passenc
|
||||
* optional, password already encrypted if true
|
||||
* @return boolean|PEAR_Error
|
||||
*/
|
||||
public static function Passwd($login, $oldpass=null, $pass='', $passenc=FALSE)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
if (!$passenc) {
|
||||
$cpass = md5($pass);
|
||||
} else {
|
||||
$cpass = $pass;
|
||||
}
|
||||
if (!is_null($oldpass)) {
|
||||
$oldcpass = md5($oldpass);
|
||||
$oldpCond = "AND pass='$oldcpass'";
|
||||
} else {
|
||||
$oldpCond = '';
|
||||
}
|
||||
$sql = "UPDATE ".$CC_CONFIG['subjTable']." SET pass='$cpass'"
|
||||
." WHERE login='$login' $oldpCond AND type='U'";
|
||||
$r = $CC_DBC->query($sql);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
return TRUE;
|
||||
} // fn passwd
|
||||
|
||||
|
||||
/* --------------------------------------------------------------- groups */
|
||||
|
||||
/**
|
||||
* Add {login} and direct/indirect members to {gname} and to groups,
|
||||
* where {gname} is [in]direct member
|
||||
*
|
||||
* @param string $login
|
||||
* @param string $gname
|
||||
* @return int|PEAR_Error
|
||||
*/
|
||||
public static function AddSubjectToGroup($login, $gname)
|
||||
{
|
||||
$uid = Subjects::GetSubjId($login);
|
||||
if (PEAR::isError($uid)) {
|
||||
return $uid;
|
||||
}
|
||||
$gid = Subjects::GetSubjId($gname);
|
||||
if (PEAR::isError($gid)) {
|
||||
return $gid;
|
||||
}
|
||||
$isgr = Subjects::IsGroup($gid);
|
||||
if (PEAR::isError($isgr)) {
|
||||
return $isgr;
|
||||
}
|
||||
if (!$isgr) {
|
||||
return PEAR::raiseError("Subjects::addSubj2Gr: Not a group ($gname)", ALIBERR_NOTGR);
|
||||
}
|
||||
// add subject and all [in]direct members to group $gname:
|
||||
$mid = Subjects::_plainAddSubjectToGroup($uid, $gid);
|
||||
if (PEAR::isError($mid)) {
|
||||
return $mid;
|
||||
}
|
||||
// add it to all groups where $gname is [in]direct member:
|
||||
$marr = Subjects::_listRMemb($gid);
|
||||
if (PEAR::isError($marr)) {
|
||||
return $marr;
|
||||
}
|
||||
foreach ($marr as $k => $v) {
|
||||
$r = Subjects::_plainAddSubjectToGroup(
|
||||
$uid, $v['gid'], intval($v['level'])+1, $v['id']);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
}
|
||||
return $mid;
|
||||
} // fn addSubj2Gr
|
||||
|
||||
|
||||
/**
|
||||
* Remove subject from group
|
||||
*
|
||||
* @param string $login
|
||||
* @param string $gname
|
||||
* @return boolean|PEAR_Error
|
||||
*/
|
||||
public static function RemoveSubjectFromGroup($login, $gname)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$uid = Subjects::GetSubjId($login);
|
||||
if (PEAR::isError($uid)) {
|
||||
return $uid;
|
||||
}
|
||||
$gid = Subjects::GetSubjId($gname);
|
||||
if (PEAR::isError($gid)) {
|
||||
return $gid;
|
||||
}
|
||||
$sql = "SELECT id FROM ".$CC_CONFIG['smembTable']
|
||||
." WHERE uid='$uid' AND gid='$gid' AND mid is null";
|
||||
$mid = $CC_DBC->getOne($sql);
|
||||
if (is_null($mid)) {
|
||||
return FALSE;
|
||||
}
|
||||
if (PEAR::isError($mid)) {
|
||||
return $mid;
|
||||
}
|
||||
// remove it:
|
||||
$r = Subjects::_removeMemb($mid);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
// and rebuild indirect memberships:
|
||||
$r = Subjects::_rebuildRels();
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
return TRUE;
|
||||
} // fn removeSubjFromGr
|
||||
|
||||
|
||||
/* --------------------------------------------------------- info methods */
|
||||
|
||||
/**
|
||||
* Get subject id from login
|
||||
*
|
||||
* @param string $login
|
||||
* @return int|PEAR_Error
|
||||
*/
|
||||
public static function GetSubjId($login)
|
||||
{
|
||||
global $CC_CONFIG;
|
||||
global $CC_DBC;
|
||||
$sql = "SELECT id FROM ".$CC_CONFIG['subjTable']
|
||||
." WHERE login='$login'";
|
||||
return $CC_DBC->getOne($sql);
|
||||
} // fn getSubjId
|
||||
|
||||
|
||||
/**
|
||||
* Get subject name (login) from id
|
||||
*
|
||||
* @param int $id
|
||||
* @param string $fld
|
||||
* @return string|PEAR_Error
|
||||
*/
|
||||
public static function GetSubjName($id, $fld='login')
|
||||
{
|
||||
global $CC_CONFIG;
|
||||
global $CC_DBC;
|
||||
$sql = "SELECT $fld FROM ".$CC_CONFIG['subjTable']
|
||||
." WHERE id='$id'";
|
||||
return $CC_DBC->getOne($sql);
|
||||
} // fn getSubjName
|
||||
|
||||
|
||||
/**
|
||||
* Get one subject from the table.
|
||||
*
|
||||
* @param string $p_fieldValue
|
||||
* @param string $p_fieldName
|
||||
* @return array
|
||||
*/
|
||||
public static function GetSubject($p_fieldValue, $p_fieldName='login')
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
if (!in_array($p_fieldName, array("login", "id"))) {
|
||||
return null;
|
||||
}
|
||||
$escapedValue = pg_escape_string($p_fieldValue);
|
||||
$sql = "SELECT * FROM ".$CC_CONFIG['subjTable']
|
||||
." WHERE $p_fieldName='$escapedValue'";
|
||||
$row = $CC_DBC->GetRow($sql);
|
||||
return $row;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get all subjects
|
||||
*
|
||||
* @param string $flds
|
||||
* @return array|PEAR_Error
|
||||
*/
|
||||
public static function GetSubjects($flds='id, login')
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$sql = "SELECT $flds FROM ".$CC_CONFIG['subjTable'];
|
||||
return $CC_DBC->getAll($sql);
|
||||
} // fn getSubjects
|
||||
|
||||
|
||||
/**
|
||||
* Get subjects with count of direct members
|
||||
*
|
||||
* @return array|PEAR_Error
|
||||
*/
|
||||
public static function GetSubjectsWCnt()
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$sql = "SELECT count(m.uid)as cnt, s.id, s.login, s.type"
|
||||
." FROM ".$CC_CONFIG['subjTable']." s"
|
||||
." LEFT JOIN ".$CC_CONFIG['smembTable']." m ON m.gid=s.id"
|
||||
." WHERE m.mid is null"
|
||||
." GROUP BY s.id, s.login, s.type"
|
||||
." ORDER BY s.id";
|
||||
return $CC_DBC->getAll($sql);
|
||||
} // fn getSubjectsWCnt
|
||||
|
||||
|
||||
/**
|
||||
* Return true if subject is a group
|
||||
*
|
||||
* @param int $gid
|
||||
* @return boolean|PEAR_Error
|
||||
*/
|
||||
public static function IsGroup($gid)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
if (empty($gid)) {
|
||||
return FALSE;
|
||||
}
|
||||
$sql = "SELECT type FROM ".$CC_CONFIG['subjTable']
|
||||
." WHERE id='$gid'";
|
||||
$r = $CC_DBC->getOne($sql);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
return ($r === 'G');
|
||||
} // fn isGroup
|
||||
|
||||
|
||||
/**
|
||||
* List direct members of group
|
||||
*
|
||||
* @param int $gid
|
||||
* @return array|PEAR_Error
|
||||
*/
|
||||
public static function ListGroup($gid)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$sql = "SELECT s.id, s.login, s.type"
|
||||
." FROM ".$CC_CONFIG['smembTable']." m, ".$CC_CONFIG['subjTable']." s"
|
||||
." WHERE m.uid=s.id AND m.mid is null AND m.gid='$gid'";
|
||||
return $CC_DBC->getAll($sql);
|
||||
} // fn listGroup
|
||||
|
||||
|
||||
/**
|
||||
* Return true if uid is [id]direct member of gid
|
||||
*
|
||||
* @param int $uid
|
||||
* local user id
|
||||
* @param int $gid
|
||||
* local group id
|
||||
* @return boolean
|
||||
*/
|
||||
public static function IsMemberOf($uid, $gid)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$sql = "SELECT count(*)as cnt"
|
||||
." FROM ".$CC_CONFIG['smembTable']
|
||||
." WHERE uid='$uid' AND gid='$gid'";
|
||||
$res = $CC_DBC->getOne($sql);
|
||||
if (PEAR::isError($res)) {
|
||||
return $res;
|
||||
}
|
||||
return (intval($res) > 0);
|
||||
} // fn isMemberOf
|
||||
|
||||
|
||||
/* ==================================================== "private" methods */
|
||||
|
||||
/**
|
||||
* Create membership record
|
||||
*
|
||||
* @param int $uid
|
||||
* @param int $gid
|
||||
* @param int $level
|
||||
* @param int $mid
|
||||
* @return int|PEAR_Error
|
||||
*/
|
||||
private static function _addMemb($uid, $gid, $level=0, $mid='null')
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
if ($uid == $gid) {
|
||||
return PEAR::raiseError("Subjects::_addMemb: uid==gid ($uid)", ALIBERR_BADSMEMB);
|
||||
}
|
||||
$sql = "SELECT id, level, mid FROM ".$CC_CONFIG['smembTable']
|
||||
." WHERE uid='$uid' AND gid='$gid' ORDER BY level ASC";
|
||||
$a = $CC_DBC->getAll($sql);
|
||||
if (PEAR::isError($a)) {
|
||||
return $a;
|
||||
}
|
||||
if (count($a) > 0) {
|
||||
$a0 = $a[0];
|
||||
$id = $a0['id'];
|
||||
if ($level < intval($a0['level'])){
|
||||
$sql2 = "UPDATE ".$CC_CONFIG['smembTable']
|
||||
." SET level='$level', mid=$mid WHERE id='{$a0['id']}'";
|
||||
$r = $CC_DBC->query($sql2);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$id = $CC_DBC->nextId($CC_CONFIG['smembSequence']);
|
||||
if (PEAR::isError($id)) {
|
||||
return $id;
|
||||
}
|
||||
$sql3 = "INSERT INTO ".$CC_CONFIG['smembTable']." (id, uid, gid, level, mid)"
|
||||
." VALUES ($id, $uid, $gid, $level, $mid)";
|
||||
$r = $CC_DBC->query($sql3);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
}
|
||||
return $id;
|
||||
} // fn _addMemb
|
||||
|
||||
|
||||
/**
|
||||
* Remove membership record
|
||||
*
|
||||
* @param int $mid
|
||||
* @return null|PEAR_Error
|
||||
*/
|
||||
private static function _removeMemb($mid)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$sql = "DELETE FROM ".$CC_CONFIG['smembTable']
|
||||
." WHERE id='$mid'";
|
||||
return $CC_DBC->query($sql);
|
||||
} // fn _removeMemb
|
||||
|
||||
|
||||
/**
|
||||
* List [in]direct members of group
|
||||
*
|
||||
* @param int $gid
|
||||
* @param int $uid
|
||||
* @return array|PEAR_Error
|
||||
*/
|
||||
private static function _listMemb($gid, $uid=NULL)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$sql = "SELECT id, uid, level FROM ".$CC_CONFIG['smembTable']
|
||||
." WHERE gid='$gid'".(is_null($uid) ? '' : " AND uid='$uid'");
|
||||
return $CC_DBC->getAll($sql);
|
||||
} // fn _listMemb
|
||||
|
||||
|
||||
/**
|
||||
* List groups where uid is [in]direct member
|
||||
*
|
||||
* @param int $gid
|
||||
* @param int $uid
|
||||
* @return array|PEAR_Error
|
||||
*/
|
||||
private static function _listRMemb($uid, $gid=NULL)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$sql = "SELECT id, gid, level FROM ".$CC_CONFIG['smembTable']
|
||||
." WHERE uid='$uid'".(is_null($gid) ? '' : " AND gid='$gid'");
|
||||
return $CC_DBC->getAll($sql);
|
||||
} // fn listRMemb
|
||||
|
||||
|
||||
/**
|
||||
* Add uid and its [in]direct members to gid
|
||||
*
|
||||
* @param int $uid
|
||||
* @param int $gid
|
||||
* @param int $level
|
||||
* @param int $rmid
|
||||
* @return int|PEAR_Error
|
||||
*/
|
||||
private static function _plainAddSubjectToGroup($uid, $gid, $level=0, $rmid='null')
|
||||
{
|
||||
$mid = Subjects::_addMemb($uid, $gid, $level, $rmid);
|
||||
if (PEAR::isError($mid)) {
|
||||
return $mid;
|
||||
}
|
||||
$marr = Subjects::_listMemb($uid);
|
||||
if (PEAR::isError($marr)) {
|
||||
return $marr;
|
||||
}
|
||||
foreach ($marr as $k => $v) {
|
||||
$r = Subjects::_addMemb(
|
||||
$v['uid'], $gid, intval($v['level'])+$level+1, $mid
|
||||
);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
}
|
||||
return $mid;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Rebuild indirect membership records<br>
|
||||
* it's probably more complicated to do removing without rebuild ...
|
||||
*
|
||||
* @return true|PEAR_Error
|
||||
*/
|
||||
private static function _rebuildRels()
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$CC_DBC->query("BEGIN");
|
||||
$r = $CC_DBC->query("LOCK TABLE ".$CC_CONFIG['smembTable']);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$sql = "DELETE FROM ".$CC_CONFIG['smembTable']
|
||||
." WHERE mid is not null";
|
||||
$r = $CC_DBC->query($sql);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$arr = $CC_DBC->getAll("SELECT uid, gid FROM ".$CC_CONFIG['smembTable']);
|
||||
// WHERE mid is null
|
||||
if (PEAR::isError($arr)) {
|
||||
return $arr;
|
||||
}
|
||||
foreach ($arr as $it) {
|
||||
$marr = Subjects::_listRMemb($it['gid']);
|
||||
if (PEAR::isError($marr)) {
|
||||
return $marr;
|
||||
}
|
||||
foreach ($marr as $k => $v) {
|
||||
$r = Subjects::_plainAddSubjectToGroup(
|
||||
$it['uid'], $v['gid'], intval($v['level'])+1, $v['id']
|
||||
);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
}
|
||||
}
|
||||
$r = $CC_DBC->query("COMMIT");
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
return TRUE;
|
||||
} // fn _rebuildRels
|
||||
|
||||
|
||||
/* =============================================== test and debug methods */
|
||||
|
||||
/**
|
||||
* Dump subjects for debug
|
||||
*
|
||||
* @param string $indstr
|
||||
* indentation string
|
||||
* @param string $ind
|
||||
* actual indentation
|
||||
* @return string
|
||||
*/
|
||||
public static function DumpSubjects($indstr=' ', $ind='')
|
||||
{
|
||||
$r = $ind.join(', ', array_map(
|
||||
create_function('$v', 'return "{$v[\'login\']}({$v[\'cnt\']})";'),
|
||||
Subjects::GetSubjectsWCnt()
|
||||
))."\n";
|
||||
return $r;
|
||||
} // fn dumpSubjects
|
||||
|
||||
|
||||
/**
|
||||
* Delete all subjects and membership records
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function DeleteData()
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$CC_DBC->query("DELETE FROM ".$CC_CONFIG['subjTable']);
|
||||
$CC_DBC->query("DELETE FROM ".$CC_CONFIG['smembTable']);
|
||||
//ObjClasses::DeleteData();
|
||||
} // fn deleteData
|
||||
|
||||
|
||||
/**
|
||||
* Insert test data
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function TestData()
|
||||
{
|
||||
// $tdata = ObjClasses::TestData();
|
||||
// $o['root'] = Subjects::AddSubj('root', 'q');
|
||||
// $o['test1'] = Subjects::AddSubj('test1', 'a');
|
||||
// $o['test2'] = Subjects::AddSubj('test2', 'a');
|
||||
// $o['test3'] = Subjects::AddSubj('test3', 'a');
|
||||
// $o['test4'] = Subjects::AddSubj('test4', 'a');
|
||||
// $o['test5'] = Subjects::AddSubj('test5', 'a');
|
||||
// $o['gr1'] = Subjects::AddSubj('gr1');
|
||||
// $o['gr2'] = Subjects::AddSubj('gr2');
|
||||
// $o['gr3'] = Subjects::AddSubj('gr3');
|
||||
// $o['gr4'] = Subjects::AddSubj('gr4');
|
||||
// Subjects::AddSubjectToGroup('test1', 'gr1');
|
||||
// Subjects::AddSubjectToGroup('test2', 'gr2');
|
||||
// Subjects::AddSubjectToGroup('test3', 'gr3');
|
||||
// Subjects::AddSubjectToGroup('test4', 'gr4');
|
||||
// Subjects::AddSubjectToGroup('test5', 'gr1');
|
||||
// Subjects::AddSubjectToGroup('gr4', 'gr3');
|
||||
// Subjects::AddSubjectToGroup('gr3', 'gr2');
|
||||
// $tdata['subjects'] = $o;
|
||||
// return $tdata;
|
||||
} // fn TestData
|
||||
|
||||
|
||||
/**
|
||||
* Make basic test
|
||||
*
|
||||
*/
|
||||
public static function Test()
|
||||
{
|
||||
// $p = ObjClasses::Test();
|
||||
// if (PEAR::isError($p)) {
|
||||
// return $p;
|
||||
// }
|
||||
// Subjects::DeleteData();
|
||||
// Subjects::TestData();
|
||||
// $test_correct = "root(0), test1(0), test2(0), test3(0),".
|
||||
// " test4(0), test5(0), gr1(2), gr2(2), gr3(2), gr4(1)\n";
|
||||
// $test_dump = Subjects::DumpSubjects();
|
||||
// Subjects::RemoveSubj('test1');
|
||||
// Subjects::RemoveSubj('test3');
|
||||
// Subjects::RemoveSubjectFromGroup('test5', 'gr1');
|
||||
// Subjects::RemoveSubjectFromGroup('gr3', 'gr2');
|
||||
// $test_correct .= "root(0), test2(0), test4(0), test5(0),".
|
||||
// " gr1(0), gr2(1), gr3(1), gr4(1)\n";
|
||||
// $test_dump .= Subjects::DumpSubjects();
|
||||
// Subjects::DeleteData();
|
||||
// if ($test_dump == $test_correct) {
|
||||
// $test_log .= "subj: OK\n";
|
||||
// return TRUE;
|
||||
// } else {
|
||||
// return PEAR::raiseError(
|
||||
// 'Subjects::test:', 1, PEAR_ERROR_DIE, '%s'.
|
||||
// "<pre>\ncorrect:\n{$test_correct}\n".
|
||||
// "dump:\n{$test_dump}\n</pre>\n");
|
||||
// }
|
||||
} // fn test
|
||||
|
||||
} // class Subjects
|
||||
?>
|
||||
1833
application/models/Transport.php
Normal file
1833
application/models/Transport.php
Normal file
File diff suppressed because it is too large
Load Diff
419
application/models/TransportRecord.php
Normal file
419
application/models/TransportRecord.php
Normal file
@ -0,0 +1,419 @@
|
||||
<?php
|
||||
|
||||
define('TR_LEAVE_CLOSED', TRUE);
|
||||
|
||||
/**
|
||||
* Auxiliary class for transport records
|
||||
*
|
||||
* @package Campcaster
|
||||
* @subpackage StorageServer
|
||||
* @copyright 2010 Sourcefabric O.P.S.
|
||||
* @license http://www.gnu.org/licenses/gpl.txt
|
||||
*/
|
||||
class TransportRecord
|
||||
{
|
||||
/**
|
||||
* @var DB
|
||||
*/
|
||||
//public $dbc;
|
||||
|
||||
/**
|
||||
* @var GreenBox
|
||||
*/
|
||||
private $gb;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
//private $config;
|
||||
|
||||
/**
|
||||
* @var Transport
|
||||
*/
|
||||
private $tr;
|
||||
|
||||
/**
|
||||
* @var boolean
|
||||
*/
|
||||
private $recalled = FALSE;
|
||||
|
||||
/**
|
||||
* @var boolean
|
||||
*/
|
||||
private $dropped = FALSE;
|
||||
|
||||
|
||||
/**
|
||||
* @param Transport $tr
|
||||
* @return TransportRecord
|
||||
*/
|
||||
public function __construct(&$tr)
|
||||
{
|
||||
$this->tr =& $tr;
|
||||
$this->gb =& $tr->gb;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Factory method
|
||||
*
|
||||
* @param Transport $tr
|
||||
* @param string $trtype
|
||||
* transport type (see Transport::install)
|
||||
* @param string $direction
|
||||
* 'up' | 'down'
|
||||
* @param array $defaults
|
||||
* default parameters (optional, internal use)
|
||||
* @return TransportRecord
|
||||
*/
|
||||
function create(&$tr, $trtype, $direction='up', $defaults=array())
|
||||
{
|
||||
global $CC_DBC, $CC_CONFIG;
|
||||
$trec = new TransportRecord($tr);
|
||||
$trec->trtok = $trtok = $tr->_createTransportToken();
|
||||
$trec->row = array_merge($defaults,
|
||||
array('trtype'=>$trtype, 'direction'=>$direction));
|
||||
$trec->recalled = TRUE;
|
||||
if (!isset($defaults['title'])) {
|
||||
$defaults['title'] = $trec->getTitle();
|
||||
if (PEAR::isError($defaults['title'])) {
|
||||
return $defaults['title'];
|
||||
}
|
||||
}
|
||||
$id = $CC_DBC->nextId($CC_CONFIG['transSequence']);
|
||||
$names = "id, trtok, direction, state, trtype, start, ts";
|
||||
$values = "$id, '$trtok', '$direction', 'init', '$trtype', now(), now()";
|
||||
foreach ($defaults as $k => $v) {
|
||||
$sqlVal = $trec->_getSqlVal($k, $v);
|
||||
$names .= ", $k";
|
||||
$values .= ", $sqlVal";
|
||||
}
|
||||
$query = "
|
||||
INSERT INTO ".$CC_CONFIG['transTable']."
|
||||
($names)
|
||||
VALUES
|
||||
($values)
|
||||
";
|
||||
$res = $CC_DBC->query($query);
|
||||
if (PEAR::isError($res)) {
|
||||
return $res;
|
||||
}
|
||||
return $trec;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Recall transport record from DB
|
||||
*
|
||||
* @param Transport $tr
|
||||
* @param string $trtok
|
||||
* transport token
|
||||
* @return TransportRecord
|
||||
*/
|
||||
function recall(&$tr, $trtok)
|
||||
{
|
||||
global $CC_DBC, $CC_CONFIG;
|
||||
$trec = new TransportRecord($tr);
|
||||
$trec->trtok = $trtok;
|
||||
$row = $CC_DBC->getRow("
|
||||
SELECT
|
||||
id, trtok, state, trtype, direction,
|
||||
to_hex(gunid)as gunid, to_hex(pdtoken)as pdtoken,
|
||||
fname, localfile, url, rtrtok, mdtrtok, uid,
|
||||
expectedsize, realsize, expectedsum, realsum,
|
||||
errmsg, title, jobpid
|
||||
FROM ".$CC_CONFIG['transTable']."
|
||||
WHERE trtok='$trtok'
|
||||
");
|
||||
if (PEAR::isError($row)) {
|
||||
return $row;
|
||||
}
|
||||
if (is_null($row)) {
|
||||
return PEAR::raiseError("TransportRecord::recall:".
|
||||
" invalid transport token ($trtok)", TRERR_TOK
|
||||
);
|
||||
}
|
||||
$row['pdtoken'] = StoredFile::NormalizeGunid($row['pdtoken']);
|
||||
$row['gunid'] = StoredFile::NormalizeGunid($row['gunid']);
|
||||
$trec->row = $row;
|
||||
$trec->recalled = TRUE;
|
||||
return $trec;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set state of transport record
|
||||
*
|
||||
* @param string $newState
|
||||
* @param array $data
|
||||
* other data fields to set
|
||||
* @param string $oldState
|
||||
* check old state and do nothing if differ
|
||||
* @param boolean $lock
|
||||
* check lock and do nothing if differ
|
||||
* @return boolean success
|
||||
*/
|
||||
function setState($newState, $data=array(), $oldState=NULL, $lock=NULL)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$set = " state='$newState', ts=now()";
|
||||
if (!is_null($lock)) {
|
||||
$slock = ($lock ? 'Y' : 'N');
|
||||
$nlock = (!$lock);
|
||||
$snlock = ($nlock ? 'Y' : 'N');
|
||||
$set .= ", lock='$snlock'";
|
||||
}
|
||||
foreach ($data as $k => $v) {
|
||||
$set .= ", $k=".$this->_getSqlVal($k, $v);
|
||||
}
|
||||
$r = $CC_DBC->query("
|
||||
UPDATE ".$CC_CONFIG['transTable']."
|
||||
SET $set
|
||||
WHERE trtok='{$this->trtok}'".
|
||||
(is_null($oldState) ? '' : " AND state='$oldState'").
|
||||
(is_null($lock) ? '' : " AND lock = '$slock'")
|
||||
);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
// return TRUE;
|
||||
$affRows = $CC_DBC->affectedRows();
|
||||
if (PEAR::isError($affRows)) {
|
||||
return $affRows;
|
||||
}
|
||||
return ($affRows == 1);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return state of transport record
|
||||
*
|
||||
* @return string
|
||||
* state
|
||||
*/
|
||||
function getState()
|
||||
{
|
||||
if (!$this->recalled) {
|
||||
return PEAR::raiseError("TransportRecord::getState:".
|
||||
" not recalled ({$this->trtok})", TRERR_TOK
|
||||
);
|
||||
}
|
||||
return $this->row['state'];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set lock on transport record and save/clear process id
|
||||
*
|
||||
* @param boolean $lock
|
||||
* lock if true, release lock if false
|
||||
* @param int $pid
|
||||
* process id
|
||||
* @return mixed
|
||||
* true or error
|
||||
*/
|
||||
function setLock($lock, $pid=NULL)
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
$pidsql = (is_null($pid) ? "NULL" : "$pid" );
|
||||
if ($this->dropped) {
|
||||
return TRUE;
|
||||
}
|
||||
$slock = ($lock ? 'Y' : 'N');
|
||||
$nlock = (!$lock);
|
||||
$snlock = ($nlock ? 'Y' : 'N');
|
||||
$r = $CC_DBC->query("
|
||||
UPDATE ".$CC_CONFIG['transTable']."
|
||||
SET lock='$slock', jobpid=$pidsql, ts=now()
|
||||
WHERE trtok='{$this->trtok}' AND lock = '$snlock'"
|
||||
);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$affRows = $CC_DBC->affectedRows();
|
||||
if (PEAR::isError($affRows)) {
|
||||
return $affRows;
|
||||
}
|
||||
if ($affRows === 0) {
|
||||
$ltxt = ($lock ? 'lock' : 'unlock' );
|
||||
return PEAR::raiseError(
|
||||
"TransportRecord::setLock: can't $ltxt ({$this->trtok})"
|
||||
);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return type of transport
|
||||
*
|
||||
* @return string
|
||||
* Transport type
|
||||
*/
|
||||
function getTransportType()
|
||||
{
|
||||
if (!$this->recalled) {
|
||||
return PEAR::raiseError("TransportRecord::getTransportType:".
|
||||
" not recalled ({$this->trtok})", TRERR_TOK
|
||||
);
|
||||
}
|
||||
return $this->row['trtype'];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Kill transport job (on pause or cancel)
|
||||
*
|
||||
* @return string
|
||||
* Transport type
|
||||
*/
|
||||
function killJob()
|
||||
{
|
||||
if (!$this->recalled) {
|
||||
return PEAR::raiseError("TransportRecord::getTransportType:".
|
||||
" not recalled ({$this->trtok})", TRERR_TOK
|
||||
);
|
||||
}
|
||||
$jobpid = $this->row['jobpid'];
|
||||
$res = system("pkill -P $jobpid", $status);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set state to failed and set error message in transport record
|
||||
*
|
||||
* @param string $txt
|
||||
* base part of error message
|
||||
* @param PEAR_Error $eo
|
||||
* (opt.) error msg can be construct from it
|
||||
* @return mixed
|
||||
* boolean true or error
|
||||
*/
|
||||
function fail($txt='', $eo=NULL)
|
||||
{
|
||||
if (!$this->recalled) {
|
||||
return PEAR::raiseError("TransportRecord::fail:".
|
||||
" not recalled ({$this->trtok})", TRERR_TOK
|
||||
);
|
||||
}
|
||||
$msg = $txt;
|
||||
if (!is_null($eo)) {
|
||||
$msg .= $eo->getMessage()." ".$eo->getUserInfo().
|
||||
" [".$eo->getCode()."]";
|
||||
}
|
||||
$r = $this->setState('failed', array('errmsg'=>$msg));
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Close transport record
|
||||
*
|
||||
* @return mixed
|
||||
* boolean true or error
|
||||
*/
|
||||
function close()
|
||||
{
|
||||
global $CC_CONFIG, $CC_DBC;
|
||||
if (!$this->recalled) {
|
||||
return PEAR::raiseError("TransportRecord::close:".
|
||||
" not recalled ({$this->trtok})", TRERR_TOK
|
||||
);
|
||||
}
|
||||
if (TR_LEAVE_CLOSED) {
|
||||
$r = $this->setState('closed');
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
} else {
|
||||
$r = $CC_DBC->query("
|
||||
DELETE FROM ".$CC_CONFIG['transTable']."
|
||||
WHERE trtok='{$this->trtok}'
|
||||
");
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$this->recalled = FALSE;
|
||||
$this->dropped = TRUE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add field specific envelopes to values (e.g. ' around strings)
|
||||
*
|
||||
* @param string $fldName
|
||||
* field name
|
||||
* @param mixed $fldVal
|
||||
* field value
|
||||
* @return string
|
||||
*/
|
||||
function _getSqlVal($fldName, $fldVal)
|
||||
{
|
||||
switch ($fldName) {
|
||||
case 'realsize':
|
||||
case 'expectedsize':
|
||||
case 'uid':
|
||||
return ("$fldVal"!='' ? "$fldVal" : "NULL");
|
||||
break;
|
||||
case 'gunid':
|
||||
case 'pdtoken':
|
||||
return "x'$fldVal'::bigint";
|
||||
break;
|
||||
default:
|
||||
$fldVal = pg_escape_string($fldVal);
|
||||
return "'$fldVal'";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get title from transported object's metadata (if exists)
|
||||
*
|
||||
* @return string
|
||||
* the title or descriptive string
|
||||
*/
|
||||
function getTitle()
|
||||
{
|
||||
$defStr = 'unknown';
|
||||
$trtype = $this->getTransportType(); //contains recall check
|
||||
if (PEAR::isError($trtype)) {
|
||||
return $trtype;
|
||||
}
|
||||
switch ($trtype) {
|
||||
case "audioclip":
|
||||
case "playlist":
|
||||
case "playlistPkg":
|
||||
case "metadata":
|
||||
$title = $this->gb->bsGetTitle(NULL, $this->row['gunid']);
|
||||
if (is_null($title)) {
|
||||
$title = $defStr;
|
||||
}
|
||||
if (PEAR::isError($title)) {
|
||||
if ($title->getCode() == GBERR_FOBJNEX) {
|
||||
$title = $defStr;
|
||||
} else {
|
||||
return $title;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case "searchjob":
|
||||
$title = 'searchjob';
|
||||
break;
|
||||
case "file":
|
||||
$title = ( isset($this->row['localfile']) ?
|
||||
basename($this->row['localfile']) : 'regular file');
|
||||
break;
|
||||
default:
|
||||
$title = $defStr;
|
||||
}
|
||||
return $title;
|
||||
}
|
||||
|
||||
} // class TransportRecord
|
||||
?>
|
||||
36
application/models/Users.php
Normal file
36
application/models/Users.php
Normal file
@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
class User {
|
||||
|
||||
public function getUsers($type=NULL) {
|
||||
global $CC_DBC;
|
||||
|
||||
$sql;
|
||||
|
||||
$sql_gen = "SELECT id, login, type FROM cc_subjs";
|
||||
$sql = $sql_gen;
|
||||
|
||||
|
||||
if(!is_null($type)){
|
||||
|
||||
if(is_array($type)) {
|
||||
for($i=0; $i<count($type); $i++) {
|
||||
$type[$i] = "type = '{$type[$i]}'";
|
||||
}
|
||||
$sql_type = join(" OR ", $type);
|
||||
}
|
||||
else {
|
||||
$sql_type = "type = {$type}";
|
||||
}
|
||||
|
||||
$sql = $sql_gen ." WHERE ". $sql_type;
|
||||
}
|
||||
|
||||
return $CC_DBC->GetAll($sql);
|
||||
}
|
||||
|
||||
public function getHosts() {
|
||||
return $this->getUsers(array('H', 'A'));
|
||||
}
|
||||
|
||||
}
|
||||
385
application/models/Validator.php
Normal file
385
application/models/Validator.php
Normal file
@ -0,0 +1,385 @@
|
||||
<?php
|
||||
define('VAL_ROOT', 110);
|
||||
define('VAL_NOREQE', 111);
|
||||
define('VAL_NOONEOF', 112);
|
||||
define('VAL_UNKNOWNE', 113);
|
||||
define('VAL_UNKNOWNA', 114);
|
||||
define('VAL_NOTDEF', 115);
|
||||
define('VAL_UNEXPONEOF', 116);
|
||||
define('VAL_FORMAT', 117);
|
||||
define('VAL_CONTENT', 118);
|
||||
define('VAL_NOREQA', 119);
|
||||
define('VAL_ATTRIB', 120);
|
||||
define('VAL_PREDXML', 121);
|
||||
|
||||
/**
|
||||
* Simple XML validator against structure stored in PHP hash-array hierarchy.
|
||||
*
|
||||
* Basic format files:
|
||||
* <ul>
|
||||
* <li>audioClipFormat.php</li>
|
||||
* <li>webstreamFormat.php</li>
|
||||
* <li>playlistFormat.php</li>
|
||||
* </ul>
|
||||
* It probably should be replaced by XML schema validation in the future.
|
||||
*
|
||||
* @package Campcaster
|
||||
* @subpackage StorageServer
|
||||
* @copyright 2010 Sourcefabric O.P.S.
|
||||
* @license http://www.gnu.org/licenses/gpl.txt
|
||||
*/
|
||||
class Validator {
|
||||
/**
|
||||
* Format type of validated document
|
||||
* @var string
|
||||
*/
|
||||
private $format = NULL;
|
||||
|
||||
/**
|
||||
* Preloaded format tree structure
|
||||
* @var array
|
||||
*/
|
||||
private $formTree = NULL;
|
||||
|
||||
/**
|
||||
* Gunid of validated file for identification in mass input
|
||||
* @var string
|
||||
*/
|
||||
private $gunid = NULL;
|
||||
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param string $format
|
||||
* format type of validated document
|
||||
* @param string $gunid
|
||||
* gunid of validated file for identification in mass input
|
||||
*/
|
||||
public function __construct($format, $gunid)
|
||||
{
|
||||
$format = strtolower($format);
|
||||
$this->format = $format;
|
||||
$this->gunid = $gunid;
|
||||
$formats = array(
|
||||
'audioclip' => "audioClipFormat",
|
||||
'playlist' => "playlistFormat",
|
||||
'webstream' => "webstreamFormat",
|
||||
);
|
||||
if (!isset($formats[$format])) {
|
||||
return $this->_err(VAL_FORMAT);
|
||||
}
|
||||
$formatName = $formats[$format];
|
||||
$formatFile = dirname(__FILE__)."/$formatName.php";
|
||||
if (!file_exists($formatFile)) {
|
||||
return $this->_err(VAL_FORMAT);
|
||||
}
|
||||
require($formatFile);
|
||||
$this->formTree = $$formatName;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Validate document - only wrapper for validateNode method
|
||||
*
|
||||
* @param object $data
|
||||
* validated object tree
|
||||
* @return mixed
|
||||
* TRUE or PEAR::error
|
||||
*/
|
||||
function validate(&$data)
|
||||
{
|
||||
$r = $this->validateNode($data, $this->formTree['_root']);
|
||||
return $r;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Validate one metadata value (on insert/update)
|
||||
*
|
||||
* @param string $fname
|
||||
* parent element name
|
||||
* @param string $category
|
||||
* qualif.category name
|
||||
* @param string $predxml
|
||||
* 'A' | 'T' (attr or tag)
|
||||
* @param string $value
|
||||
* validated element value
|
||||
* @return TRUE|PEAR_Error
|
||||
*/
|
||||
function validateOneValue($fname, $category, $predxml, $value)
|
||||
{
|
||||
$formTree =& $this->formTree;
|
||||
switch ($predxml) {
|
||||
case 'T':
|
||||
if (!$this->isChildInFormat($fname, $category)) {
|
||||
return $this->_err(VAL_UNKNOWNE, "$category in $fname");
|
||||
}
|
||||
break;
|
||||
case 'A':
|
||||
if (!$this->isAttrInFormat($fname, $category)) {
|
||||
return $this->_err(VAL_UNKNOWNA, "$category in $fname");
|
||||
}
|
||||
break;
|
||||
case 'N':
|
||||
return TRUE;
|
||||
break;
|
||||
default:
|
||||
return $this->_err(VAL_PREDXML, $predxml);
|
||||
}
|
||||
if (isset($formTree[$category]['regexp'])) {
|
||||
// echo "XXX {$formTree[$fname]['regexp']} / ".$node->content."\n";
|
||||
if (!preg_match("|{$formTree[$category]['regexp']}|", $value)) {
|
||||
return $this->_err(VAL_CONTENT, "$category/$value");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Validation of one element node from object tree
|
||||
*
|
||||
* @param object $node
|
||||
* validated node
|
||||
* @param string $fname
|
||||
* actual name in format structure
|
||||
* @return mixed
|
||||
* TRUE or PEAR::error
|
||||
*/
|
||||
function validateNode(&$node, $fname)
|
||||
{
|
||||
$dname = (($node->ns? $node->ns.":" : '').$node->name);
|
||||
$formTree =& $this->formTree;
|
||||
if (DEBUG) {
|
||||
echo"\nVAL::validateNode: 1 $dname/$fname\n";
|
||||
}
|
||||
// check root node name:
|
||||
if ($dname != $fname) {
|
||||
return $this->_err(VAL_ROOT, $fname);
|
||||
}
|
||||
// check if this element is defined in format:
|
||||
if (!isset($formTree[$fname])) {
|
||||
return $this->_err(VAL_NOTDEF, $fname);
|
||||
}
|
||||
// check element content
|
||||
if (isset($formTree[$fname]['regexp'])) {
|
||||
// echo "XXX {$formTree[$fname]['regexp']} / ".$node->content."\n";
|
||||
if (!preg_match("|{$formTree[$fname]['regexp']}|", $node->content)) {
|
||||
return $this->_err(VAL_CONTENT, "$fname/{$node->content}");
|
||||
}
|
||||
}
|
||||
// validate attributes:
|
||||
$ra = $this->validateAttributes($node, $fname);
|
||||
if (PEAR::isError($ra)) {
|
||||
return $ra;
|
||||
}
|
||||
// validate children:
|
||||
$r = $this->validateChildren($node, $fname);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Validation of attributes
|
||||
*
|
||||
* @param object $node
|
||||
* validated node
|
||||
* @param string $fname
|
||||
* actual name in format structure
|
||||
* @return mixed
|
||||
* TRUE or PEAR::error
|
||||
*/
|
||||
function validateAttributes(&$node, $fname)
|
||||
{
|
||||
$formTree =& $this->formTree;
|
||||
$attrs = array();
|
||||
// check if all attrs are permitted here:
|
||||
foreach ($node->attrs as $i => $attr) {
|
||||
$aname = (($attr->ns? $attr->ns.":" : '').$attr->name);
|
||||
$attrs[$aname] =& $node->attrs[$i];
|
||||
if (!$this->isAttrInFormat($fname, $aname)) {
|
||||
return $this->_err(VAL_UNKNOWNA, $aname);
|
||||
}
|
||||
// check attribute format
|
||||
// echo "XXA $aname\n";
|
||||
if (isset($formTree[$aname]['regexp'])) {
|
||||
// echo "XAR {$formTree[$fname]['regexp']} / ".$node->content."\n";
|
||||
if (!preg_match("|{$formTree[$aname]['regexp']}|", $attr->val)) {
|
||||
return $this->_err(VAL_ATTRIB, "$aname [".var_export($attr->val,TRUE)."]");
|
||||
}
|
||||
}
|
||||
}
|
||||
// check if all required attrs are here:
|
||||
if (isset($formTree[$fname]['attrs'])) {
|
||||
$fattrs =& $formTree[$fname]['attrs'];
|
||||
if (isset($fattrs['required'])) {
|
||||
foreach ($fattrs['required'] as $i => $attr) {
|
||||
if (!isset($attrs[$attr])) {
|
||||
return $this->_err(VAL_NOREQA, $attr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Validation children nodes
|
||||
*
|
||||
* @param object $node
|
||||
* validated node
|
||||
* @param string $fname
|
||||
* actual name in format structure
|
||||
* @return mixed
|
||||
* TRUE or PEAR::error
|
||||
*/
|
||||
function validateChildren(&$node, $fname)
|
||||
{
|
||||
$formTree =& $this->formTree;
|
||||
$childs = array();
|
||||
// check if all children are permitted here:
|
||||
foreach ($node->children as $i => $ch) {
|
||||
$chname = (($ch->ns? $ch->ns.":" : '').$ch->name);
|
||||
// echo "XXE $chname\n";
|
||||
if (!$this->isChildInFormat($fname, $chname)) {
|
||||
return $this->_err(VAL_UNKNOWNE, $chname);
|
||||
}
|
||||
// call children recursive:
|
||||
$r = $this->validateNode($node->children[$i], $chname);
|
||||
if (PEAR::isError($r)) {
|
||||
return $r;
|
||||
}
|
||||
$childs[$chname] = TRUE;
|
||||
}
|
||||
// check if all required children are here:
|
||||
if (isset($formTree[$fname]['childs'])) {
|
||||
$fchilds =& $formTree[$fname]['childs'];
|
||||
if (isset($fchilds['required'])) {
|
||||
foreach ($fchilds['required'] as $i => $ch) {
|
||||
if (!isset($childs[$ch])) return $this->_err(VAL_NOREQE, $ch);
|
||||
}
|
||||
}
|
||||
// required one from set
|
||||
if (isset($fchilds['oneof'])) {
|
||||
$one = FALSE;
|
||||
foreach ($fchilds['oneof'] as $i => $ch) {
|
||||
if (isset($childs[$ch])) {
|
||||
if ($one) {
|
||||
return $this->_err(VAL_UNEXPONEOF, "$ch in $fname");
|
||||
}
|
||||
$one = TRUE;
|
||||
}
|
||||
}
|
||||
if (!$one) {
|
||||
return $this->_err(VAL_NOONEOF);
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Test if child is presented in format structure
|
||||
*
|
||||
* @param string $fname
|
||||
* node name in format structure
|
||||
* @param string $chname
|
||||
* child node name
|
||||
* @return boolean
|
||||
*/
|
||||
function isChildInFormat($fname, $chname)
|
||||
{
|
||||
$listo = $this->isInFormatAs($fname, $chname, 'childs', 'optional');
|
||||
$listr = $this->isInFormatAs($fname, $chname, 'childs', 'required');
|
||||
$list1 = $this->isInFormatAs($fname, $chname, 'childs', 'oneof');
|
||||
return ($listo!==FALSE || $listr!==FALSE || $list1!==FALSE);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Test if attribute is presented in format structure
|
||||
*
|
||||
* @param string $fname
|
||||
* node name in format structure
|
||||
* @param string $aname
|
||||
* attribute name
|
||||
* @return boolean
|
||||
*/
|
||||
function isAttrInFormat($fname, $aname)
|
||||
{
|
||||
$listr = $this->isInFormatAs($fname, $aname, 'attrs', 'required');
|
||||
$listi = $this->isInFormatAs($fname, $aname, 'attrs', 'implied');
|
||||
$listn = $this->isInFormatAs($fname, $aname, 'attrs', 'normal');
|
||||
return ($listr!==FALSE || $listi!==FALSE || $listn!==FALSE);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check if node/attribute is presented in format structure
|
||||
*
|
||||
* @param string $fname
|
||||
* node name in format structure
|
||||
* @param string $chname
|
||||
* node/attribute name
|
||||
* @param string $nType
|
||||
* 'childs' | 'attrs'
|
||||
* @param string $reqType
|
||||
* <ul>
|
||||
* <li>for elements: 'required' | 'optional' | 'oneof'</li>
|
||||
* <li>for attributes: 'required' | 'implied' | 'normal'</li>
|
||||
* </ul>
|
||||
* @return mixed
|
||||
* boolean/int (index int format array returned if found)
|
||||
*/
|
||||
function isInFormatAs($fname, $chname, $nType='childs', $reqType='required')
|
||||
{
|
||||
$formTree =& $this->formTree;
|
||||
$listed = (
|
||||
isset($formTree[$fname][$nType][$reqType]) ?
|
||||
array_search($chname, $formTree[$fname][$nType][$reqType]) :
|
||||
FALSE
|
||||
);
|
||||
return $listed;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Error exception generator
|
||||
*
|
||||
* @param int $errno
|
||||
* erron code
|
||||
* @param string $par
|
||||
* optional string for more descriptive error messages
|
||||
* @return PEAR_Error
|
||||
*/
|
||||
function _err($errno, $par='')
|
||||
{
|
||||
$msg = array(
|
||||
VAL_ROOT => 'Wrong root element',
|
||||
VAL_NOREQE => 'Required element missing',
|
||||
VAL_NOONEOF => 'One-of element missing',
|
||||
VAL_UNKNOWNE => 'Unknown element',
|
||||
VAL_UNKNOWNA => 'Unknown attribute',
|
||||
VAL_NOTDEF => 'Not defined',
|
||||
VAL_UNEXPONEOF => 'Unexpected second object from one-of set',
|
||||
VAL_FORMAT => 'Unknown format',
|
||||
VAL_CONTENT => 'Invalid content',
|
||||
VAL_NOREQA => 'Required attribute missing',
|
||||
VAL_ATTRIB => 'Invalid attribute format',
|
||||
VAL_PREDXML => 'Invalid predicate type',
|
||||
);
|
||||
return PEAR::raiseError(
|
||||
"Validator: {$msg[$errno]} #$errno ($par, gunid={$this->gunid})",
|
||||
$errno
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
} // class Validator
|
||||
|
||||
?>
|
||||
398
application/models/XmlParser.php
Normal file
398
application/models/XmlParser.php
Normal file
@ -0,0 +1,398 @@
|
||||
<?php
|
||||
/**
|
||||
* @package Campcaster
|
||||
* @subpackage StorageServer
|
||||
*/
|
||||
require_once "XML/Util.php";
|
||||
|
||||
/* ================================================================== Element */
|
||||
|
||||
/**
|
||||
* Object representation of one XML element
|
||||
*
|
||||
* @package Campcaster
|
||||
* @subpackage StorageServer
|
||||
* @copyright 2010 Sourcefabric O.P.S.
|
||||
* @license http://www.gnu.org/licenses/gpl.txt
|
||||
* @see MetaData
|
||||
*/
|
||||
class XmlElement {
|
||||
/**
|
||||
* Namespace prefix
|
||||
* @var string
|
||||
*/
|
||||
public $ns;
|
||||
|
||||
/**
|
||||
* Element name
|
||||
* @var string
|
||||
*/
|
||||
public $name;
|
||||
|
||||
/**
|
||||
* Attributes
|
||||
* @var array
|
||||
*/
|
||||
public $attrs = array();
|
||||
|
||||
/**
|
||||
* Namespace definitions
|
||||
* @var array
|
||||
*/
|
||||
public $nSpaces = array();
|
||||
|
||||
/**
|
||||
* Child nodes
|
||||
* @var array
|
||||
*/
|
||||
public $children = array();
|
||||
|
||||
/**
|
||||
* Text content of element
|
||||
* @var string
|
||||
*/
|
||||
public $content = '';
|
||||
|
||||
|
||||
/**
|
||||
* @param string $fullname
|
||||
* Fully qualified name of element
|
||||
* @param array $attrs
|
||||
* hash of attributes
|
||||
* @param array $nSpaces
|
||||
* hash of namespace definitions
|
||||
* @param array $children
|
||||
* hash of child nodes
|
||||
*/
|
||||
public function __construct($fullname, $attrs, $nSpaces=array(), $children=array())
|
||||
{
|
||||
$a = XML_Util::splitQualifiedName($fullname);
|
||||
$this->ns = $a['namespace'];
|
||||
$this->name = $a['localPart'];
|
||||
$this->attrs = $attrs;
|
||||
$this->nSpaces = $nSpaces;
|
||||
$this->children = $children;
|
||||
}
|
||||
} // class XmlElement
|
||||
|
||||
|
||||
/* ================================================================ Attribute */
|
||||
/**
|
||||
* Object representation of one XML attribute
|
||||
*
|
||||
* @package Campcaster
|
||||
* @subpackage StorageServer
|
||||
* @copyright 2010 Sourcefabric O.P.S.
|
||||
* @license http://www.gnu.org/licenses/gpl.txt
|
||||
* @see MetaData
|
||||
*/
|
||||
class XmlAttrib {
|
||||
/**
|
||||
* Namespace prefix
|
||||
* @var string
|
||||
*/
|
||||
public $ns;
|
||||
|
||||
/**
|
||||
* Attribute name
|
||||
* @var string
|
||||
*/
|
||||
public $name;
|
||||
|
||||
/**
|
||||
* Attribute value
|
||||
* @var string
|
||||
*/
|
||||
public $val;
|
||||
|
||||
/**
|
||||
* @param string $atns
|
||||
* namespace prefix
|
||||
* @param string $atnm
|
||||
* attribute name
|
||||
* @param string $atv
|
||||
* attribute value
|
||||
*/
|
||||
public function __construct($atns, $atnm, $atv)
|
||||
{
|
||||
$this->ns = $atns;
|
||||
$this->name = $atnm;
|
||||
$this->val = $atv;
|
||||
}
|
||||
} // fn XmlAttrib
|
||||
|
||||
|
||||
/* =================================================================== Parser */
|
||||
/**
|
||||
* XML parser object encapsulation
|
||||
*
|
||||
* @package Campcaster
|
||||
* @subpackage StorageServer
|
||||
* @copyright 2010 Sourcefabric O.P.S.
|
||||
* @license http://www.gnu.org/licenses/gpl.txt
|
||||
* @see MetaData
|
||||
*/
|
||||
class XmlParser {
|
||||
/**
|
||||
* Tree of nodes
|
||||
* @var array
|
||||
*/
|
||||
private $tree = NULL;
|
||||
|
||||
/**
|
||||
* Parse stack
|
||||
* @var array
|
||||
*/
|
||||
private $stack = array();
|
||||
|
||||
/**
|
||||
* Error structure
|
||||
* @var array
|
||||
*/
|
||||
private $err = array(FALSE, '');
|
||||
|
||||
/**
|
||||
* @param string $data
|
||||
* XML string to be parsed
|
||||
*/
|
||||
public function __construct($data){
|
||||
$xml_parser = xml_parser_create('UTF-8');
|
||||
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, FALSE);
|
||||
xml_set_object($xml_parser, $this);
|
||||
xml_set_element_handler($xml_parser, "startTag", "endTag");
|
||||
xml_set_character_data_handler($xml_parser, 'characterData');
|
||||
$res = xml_parse($xml_parser, $data, TRUE);
|
||||
if (!$res) {
|
||||
$this->err = array(TRUE,
|
||||
sprintf("XML error: %s at line %d\n",
|
||||
xml_error_string(xml_get_error_code($xml_parser)),
|
||||
xml_get_current_line_number($xml_parser)
|
||||
)
|
||||
);
|
||||
// var_dump($data);
|
||||
}
|
||||
xml_parser_free($xml_parser);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Parse XML file or string
|
||||
*
|
||||
* @param string $data
|
||||
* local path to XML file or XML string
|
||||
* @param string $loc
|
||||
* location: 'file'|'string'
|
||||
* @return array
|
||||
* reference, parse result tree (or PEAR::error)
|
||||
*/
|
||||
function &parse($data='', $loc='file')
|
||||
{
|
||||
switch ($loc) {
|
||||
case "file":
|
||||
if (!is_file($data)) {
|
||||
return PEAR::raiseError(
|
||||
"XmlParser::parse: file not found ($data)"
|
||||
);
|
||||
}
|
||||
if (!is_readable($data)) {
|
||||
return PEAR::raiseError(
|
||||
"XmlParser::parse: can't read file ($data)"
|
||||
);
|
||||
}
|
||||
$data = file_get_contents($data);
|
||||
case "string":
|
||||
$parser = new XmlParser($data);
|
||||
if ($parser->isError()) {
|
||||
return PEAR::raiseError(
|
||||
"XmlParser::parse: ".$parser->getError()
|
||||
);
|
||||
}
|
||||
$tree = $parser->getTree();
|
||||
break;
|
||||
default:
|
||||
return PEAR::raiseError(
|
||||
"XmlParser::parse: unsupported source location ($loc)"
|
||||
);
|
||||
}
|
||||
return $tree;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Start tag handler
|
||||
*
|
||||
* @param resource $parser
|
||||
* reference to parser resource
|
||||
* @param string $fullname
|
||||
* element name
|
||||
* @param array $attrs
|
||||
* array of attributes
|
||||
* @return none
|
||||
*/
|
||||
function startTag($parser, $fullname, $attrs) {
|
||||
$nSpaces = array();
|
||||
foreach ($attrs as $atn => $atv) {
|
||||
$a = XML_Util::splitQualifiedName($atn);
|
||||
$atns = $a['namespace'];
|
||||
$atnm = $a['localPart'];
|
||||
unset($attrs[$atn]);
|
||||
if ($atns == 'xmlns') {
|
||||
$nSpaces[$atnm] = $atv;
|
||||
} else if ($atns == NULL && $atnm == 'xmlns') {
|
||||
$nSpaces[''] = $atv;
|
||||
} else {
|
||||
$attrs[$atn] = new XmlAttrib($atns, $atnm, $atv);
|
||||
}
|
||||
}
|
||||
$el = new XmlElement($fullname, $attrs, $nSpaces);
|
||||
array_push($this->stack, $el);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* End tag handler
|
||||
*
|
||||
* @param resource $parser
|
||||
* reference to parser resource
|
||||
* @param string $fullname
|
||||
* element name
|
||||
* @return none
|
||||
*/
|
||||
function endTag($parser, $fullname) {
|
||||
$cnt = count($this->stack);
|
||||
if ($cnt > 1) {
|
||||
$this->stack[$cnt-2]->children[] = $this->stack[$cnt-1];
|
||||
$lastEl = array_pop($this->stack);
|
||||
} else {
|
||||
$this->tree = $this->stack[0];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Character data handler
|
||||
*
|
||||
* @param resource $parser
|
||||
* reference to parser resource
|
||||
* @param string $data
|
||||
* @return none
|
||||
*/
|
||||
function characterData($parser, $data) {
|
||||
$cnt = count($this->stack);
|
||||
if (trim($data)!='') {
|
||||
$this->stack[$cnt-1]->content .= $data;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Default handler
|
||||
*
|
||||
* @param resource $parser
|
||||
* reference to parser resource
|
||||
* @param string $data
|
||||
* @return none
|
||||
*/
|
||||
function defaultHandler($parser, $data)
|
||||
{
|
||||
$cnt = count($this->stack);
|
||||
//if(substr($data, 0, 1) == "&" && substr($data, -1, 1) == ";"){
|
||||
// $this->stack[$cnt-1]->content .= trim($data);
|
||||
//}else{
|
||||
$this->stack[$cnt-1]->content .= "*** $data ***";
|
||||
//}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return result tree
|
||||
*
|
||||
* @return array
|
||||
* tree structure
|
||||
*/
|
||||
function getTree()
|
||||
{
|
||||
return $this->tree;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return error string
|
||||
*
|
||||
* @return boolean
|
||||
* whether error occured
|
||||
*/
|
||||
function isError()
|
||||
{
|
||||
return $this->err[0];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return error string
|
||||
*
|
||||
* @return string
|
||||
* error message
|
||||
*/
|
||||
function getError()
|
||||
{
|
||||
return $this->err[1];
|
||||
}
|
||||
|
||||
|
||||
/* ----------------------------------- auxiliary methos for serialization */
|
||||
/**
|
||||
* Serialize metadata of one file
|
||||
*
|
||||
* @return string, serialized XML
|
||||
*/
|
||||
function serialize()
|
||||
{
|
||||
$res = '<?xml version="1.0" encoding="utf-8"?>';
|
||||
$res .= $this->serializeEl($this->tree);
|
||||
$res .= "\n";
|
||||
return $res;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Serialize one metadata element
|
||||
*
|
||||
* @param el object, element object
|
||||
* @param lvl int, level for indentation
|
||||
* @return string, serialized XML
|
||||
*/
|
||||
function serializeEl($el, $lvl=0)
|
||||
{
|
||||
$ind = str_repeat(" ", $lvl);
|
||||
$elNs = $el->ns;
|
||||
$elName = $el->name;
|
||||
$attrs = XML_Util::attributesToString($el->attrs);
|
||||
$fullName = ($elNs=='' ? '' : "$elNs:")."$elName";
|
||||
$res = "\n{$ind}<{$fullName}{$attrs}>";
|
||||
$haveCh = (count($el->children)>0);
|
||||
foreach ($el->children as $ch) {
|
||||
$res .= $this->serializeEl($ch, $lvl+1);
|
||||
}
|
||||
$res .= XML_Util::replaceEntities("{$el->content}");
|
||||
if ($haveCh) {
|
||||
$res .= "\n{$ind}";
|
||||
}
|
||||
$res .= "</{$fullName}>";
|
||||
return $res;
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------------------- debug methods */
|
||||
/**
|
||||
* Debug dump of tree
|
||||
*
|
||||
* @return hash, tree structure
|
||||
*/
|
||||
function dump()
|
||||
{
|
||||
var_dump($this->tree);
|
||||
}
|
||||
|
||||
}
|
||||
?>
|
||||
328
application/models/audioClipFormat.php
Normal file
328
application/models/audioClipFormat.php
Normal file
@ -0,0 +1,328 @@
|
||||
<?php
|
||||
$audioClipFormat = array(
|
||||
'_root'=>'audioClip',
|
||||
'audioClip'=>array(
|
||||
'childs'=>array(
|
||||
'required'=>array('metadata'),
|
||||
),
|
||||
),
|
||||
'metadata'=>array(
|
||||
'childs'=>array(
|
||||
'required'=>array(
|
||||
'dc:title', 'dcterms:extent'
|
||||
),
|
||||
'optional'=>array(
|
||||
'dc:identifier',
|
||||
'dc:creator', 'dc:source', 'ls:genre',
|
||||
'ls:year', 'dc:type', 'dc:description', 'dc:format',
|
||||
'ls:bpm', 'ls:rating', 'ls:encoded_by', 'ls:track_num',
|
||||
'ls:disc_num', 'ls:disc_num', 'dc:publisher', 'ls:composer',
|
||||
'ls:bitrate', 'ls:channels', 'ls:samplerate', 'ls:encoder',
|
||||
'ls:crc', 'ls:lyrics', 'ls:orchestra', 'ls:conductor',
|
||||
'ls:lyricist', 'ls:originallyricist', 'ls:radiostationname',
|
||||
'ls:audiofileinfourl', 'ls:artisturl', 'ls:audiosourceurl',
|
||||
'ls:radiostationurl', 'ls:buycdurl', 'ls:isrcnumber',
|
||||
'ls:catalognumber', 'ls:originalartist', 'dc:rights',
|
||||
'ls:license', 'dc:title', 'dcterms:temporal',
|
||||
'dcterms:spatial', 'dcterms:entity', 'dc:description',
|
||||
'dc:creator', 'dc:subject', 'dc:type', 'dc:format',
|
||||
'dc:contributor', 'dc:language', 'dc:rights',
|
||||
'dcterms:isPartOf', 'dc:date',
|
||||
'dc:publisher',
|
||||
// extra
|
||||
'dcterms:alternative', 'ls:filename', 'ls:mtime',
|
||||
// added lately by sebastian
|
||||
'ls:mood',
|
||||
),
|
||||
),
|
||||
'namespaces'=>array(
|
||||
'dc'=>"http://purl.org/dc/elements/1.1/",
|
||||
'dcterms'=>"http://purl.org/dc/terms/",
|
||||
'xbmf'=>"http://www.streamonthefly.org/xbmf",
|
||||
'xsi'=>"http://www.w3.org/2001/XMLSchema-instance",
|
||||
'xml'=>"http://www.w3.org/XML/1998/namespace",
|
||||
),
|
||||
),
|
||||
'dc:identifier'=>array(
|
||||
'type'=>'Text',
|
||||
'auto'=>TRUE,
|
||||
),
|
||||
'dc:title'=>array(
|
||||
'type'=>'Text',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'dcterms:alternative'=>array(
|
||||
'type'=>'Text',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'dcterms:extent'=>array(
|
||||
'type'=>'Time',
|
||||
// 'regexp'=>'^\d{2}:\d{2}:\d{2}.\d{6}$',
|
||||
'regexp'=>'^((\d{1,2}:)?\d{1,2}:)?\d{1,20}(.\d{1,6})?$',
|
||||
),
|
||||
'dc:creator'=>array(
|
||||
'type'=>'Text',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'dc:source'=>array(
|
||||
'type'=>'Text',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:genre'=>array(
|
||||
'type'=>'Menu',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:year'=>array(
|
||||
'type'=>'Menu',
|
||||
'area'=>'Music',
|
||||
),
|
||||
'dc:type'=>array(
|
||||
'type'=>'Menu',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'dc:description'=>array(
|
||||
'type'=>'Longtext',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'dc:format'=>array(
|
||||
'type'=>'Menu',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:bpm'=>array(
|
||||
'type'=>'Number',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:rating'=>array(
|
||||
'type'=>'Number',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:encoded_by'=>array(
|
||||
'type'=>'Text',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:track_num'=>array(
|
||||
'type'=>'Menu',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:disc_num'=>array(
|
||||
'type'=>'Menu',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:disc_num'=>array(
|
||||
'type'=>'Menu',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'dc:publisher'=>array(
|
||||
'type'=>'Text',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:composer'=>array(
|
||||
'type'=>'Text',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:bitrate'=>array(
|
||||
'type'=>'Number',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:channels'=>array(
|
||||
'type'=>'Menu',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:samplerate'=>array(
|
||||
'type'=>'Menu',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:encoder'=>array(
|
||||
'type'=>'Text',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:crc'=>array(
|
||||
'type'=>'Number',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:lyrics'=>array(
|
||||
'type'=>'Longtext',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:orchestra'=>array(
|
||||
'type'=>'Text',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:conductor'=>array(
|
||||
'type'=>'Text',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:lyricist'=>array(
|
||||
'type'=>'Text',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:originallyricist'=>array(
|
||||
'type'=>'Text',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:radiostationname'=>array(
|
||||
'type'=>'Text',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:audiofileinfourl'=>array(
|
||||
'type'=>'URL',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:artisturl'=>array(
|
||||
'type'=>'URL',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:audiosourceurl'=>array(
|
||||
'type'=>'URL',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:radiostationurl'=>array(
|
||||
'type'=>'URL',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:buycdurl'=>array(
|
||||
'type'=>'URL',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:isrcnumber'=>array(
|
||||
'type'=>'Number',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:catalognumber'=>array(
|
||||
'type'=>'Number',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:originalartist'=>array(
|
||||
'type'=>'Text',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'dc:rights'=>array(
|
||||
'type'=>'Text',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:license'=>array(
|
||||
'type'=>'Text',
|
||||
'area'=>'Music',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'dc:title'=>array(
|
||||
'type'=>'Text',
|
||||
'area'=>'Talk',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'dcterms:temporal'=>array(
|
||||
'type'=>'Time/Date',
|
||||
'area'=>'Talk',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'dcterms:spatial'=>array(
|
||||
'type'=>'Menu',
|
||||
'area'=>'Talk',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'dcterms:entity'=>array(
|
||||
'type'=>'Text',
|
||||
'area'=>'Talk',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'dc:description'=>array(
|
||||
'type'=>'Longtext',
|
||||
'area'=>'Talk',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'dc:creator'=>array(
|
||||
'type'=>'Menu',
|
||||
'area'=>'Talk',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'dc:subject'=>array(
|
||||
'type'=>'Text',
|
||||
'area'=>'Talk',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'dc:type'=>array(
|
||||
'type'=>'Menu',
|
||||
'area'=>'Talk',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'dc:format'=>array(
|
||||
'type'=>'Menu',
|
||||
'area'=>'Talk',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'dc:contributor'=>array(
|
||||
'type'=>'Text',
|
||||
'area'=>'Talk',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'dc:language'=>array(
|
||||
'type'=>'Menu',
|
||||
'area'=>'Talk',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'dc:rights'=>array(
|
||||
'type'=>'Menu',
|
||||
'area'=>'Talk',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'dcterms:isPartOf'=>array(
|
||||
'type'=>'Text',
|
||||
'area'=>'Talk',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'dc:date'=>array(
|
||||
'type'=>'Date',
|
||||
'area'=>'Talk',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'dc:publisher'=>array(
|
||||
'type'=>'Text',
|
||||
'area'=>'Talk',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
|
||||
'ls:filename'=>array(
|
||||
'type'=>'Text',
|
||||
'attrs'=>array('implied'=>array('xml:lang')),
|
||||
),
|
||||
'ls:mtime'=>array(
|
||||
'type'=>'Int',
|
||||
// 'regexp'=>'^\d{4}(-\d{2}(-\d{2}(T\d{2}:\d{2}(:\d{2}\.\d+)?(Z)|([\+\-]?\d{2}:\d{2}))?)?)?$',
|
||||
),
|
||||
);
|
||||
|
||||
?>
|
||||
18
application/models/campcaster/CcAccess.php
Normal file
18
application/models/campcaster/CcAccess.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for representing a row from the 'cc_access' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcAccess extends BaseCcAccess {
|
||||
|
||||
} // CcAccess
|
||||
18
application/models/campcaster/CcAccessPeer.php
Normal file
18
application/models/campcaster/CcAccessPeer.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_access' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcAccessPeer extends BaseCcAccessPeer {
|
||||
|
||||
} // CcAccessPeer
|
||||
18
application/models/campcaster/CcAccessQuery.php
Normal file
18
application/models/campcaster/CcAccessQuery.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_access' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcAccessQuery extends BaseCcAccessQuery {
|
||||
|
||||
} // CcAccessQuery
|
||||
18
application/models/campcaster/CcBackup.php
Normal file
18
application/models/campcaster/CcBackup.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for representing a row from the 'cc_backup' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcBackup extends BaseCcBackup {
|
||||
|
||||
} // CcBackup
|
||||
18
application/models/campcaster/CcBackupPeer.php
Normal file
18
application/models/campcaster/CcBackupPeer.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_backup' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcBackupPeer extends BaseCcBackupPeer {
|
||||
|
||||
} // CcBackupPeer
|
||||
18
application/models/campcaster/CcBackupQuery.php
Normal file
18
application/models/campcaster/CcBackupQuery.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_backup' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcBackupQuery extends BaseCcBackupQuery {
|
||||
|
||||
} // CcBackupQuery
|
||||
31
application/models/campcaster/CcFiles.php
Normal file
31
application/models/campcaster/CcFiles.php
Normal file
@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
require_once('Common.php');
|
||||
|
||||
/**
|
||||
* Skeleton subclass for representing a row from the 'cc_files' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcFiles extends BaseCcFiles {
|
||||
|
||||
public function getDbLength()
|
||||
{
|
||||
return $this->length;
|
||||
}
|
||||
|
||||
public function setDbLength($time)
|
||||
{
|
||||
$this->length = $time;
|
||||
//$this->modifiedColumns[] = CcPlaylistcontentsPeer::LENGTH;
|
||||
return Common::setTimeInSub($this, 'LENGTH', $time);
|
||||
}
|
||||
|
||||
|
||||
} // CcFiles
|
||||
18
application/models/campcaster/CcFilesPeer.php
Normal file
18
application/models/campcaster/CcFilesPeer.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_files' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcFilesPeer extends BaseCcFilesPeer {
|
||||
|
||||
} // CcFilesPeer
|
||||
18
application/models/campcaster/CcFilesQuery.php
Normal file
18
application/models/campcaster/CcFilesQuery.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_files' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcFilesQuery extends BaseCcFilesQuery {
|
||||
|
||||
} // CcFilesQuery
|
||||
18
application/models/campcaster/CcPerms.php
Normal file
18
application/models/campcaster/CcPerms.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for representing a row from the 'cc_perms' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcPerms extends BaseCcPerms {
|
||||
|
||||
} // CcPerms
|
||||
18
application/models/campcaster/CcPermsPeer.php
Normal file
18
application/models/campcaster/CcPermsPeer.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_perms' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcPermsPeer extends BaseCcPermsPeer {
|
||||
|
||||
} // CcPermsPeer
|
||||
18
application/models/campcaster/CcPermsQuery.php
Normal file
18
application/models/campcaster/CcPermsQuery.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_perms' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcPermsQuery extends BaseCcPermsQuery {
|
||||
|
||||
} // CcPermsQuery
|
||||
48
application/models/campcaster/CcPlaylist.php
Normal file
48
application/models/campcaster/CcPlaylist.php
Normal file
@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for representing a row from the 'cc_playlist' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcPlaylist extends BaseCcPlaylist {
|
||||
|
||||
|
||||
public function computeLastPosition()
|
||||
{
|
||||
$con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME);
|
||||
|
||||
$sql = 'SELECT MAX('.CcPlaylistcontentsPeer::POSITION.') AS pos'
|
||||
. ' FROM ' .CcPlaylistcontentsPeer::TABLE_NAME
|
||||
. ' WHERE ' .CcPlaylistcontentsPeer::PLAYLIST_ID. ' = :p1';
|
||||
|
||||
$stmt = $con->prepare($sql);
|
||||
$stmt->bindValue(':p1', $this->getDbId());
|
||||
$stmt->execute();
|
||||
return $stmt->fetchColumn();
|
||||
}
|
||||
|
||||
public function computeLength()
|
||||
{
|
||||
$con = Propel::getConnection(CcPlaylistPeer::DATABASE_NAME);
|
||||
|
||||
$sql = 'SELECT SUM('.CcPlaylistcontentsPeer::CLIPLENGTH.') AS length'
|
||||
. ' FROM ' .CcPlaylistcontentsPeer::TABLE_NAME
|
||||
. ' WHERE ' .CcPlaylistcontentsPeer::PLAYLIST_ID. ' = :p1';
|
||||
|
||||
$stmt = $con->prepare($sql);
|
||||
$stmt->bindValue(':p1', $this->getDbId());
|
||||
$stmt->execute();
|
||||
return $stmt->fetchColumn();
|
||||
}
|
||||
|
||||
|
||||
} // CcPlaylist
|
||||
18
application/models/campcaster/CcPlaylistPeer.php
Normal file
18
application/models/campcaster/CcPlaylistPeer.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_playlist' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcPlaylistPeer extends BaseCcPlaylistPeer {
|
||||
|
||||
} // CcPlaylistPeer
|
||||
18
application/models/campcaster/CcPlaylistQuery.php
Normal file
18
application/models/campcaster/CcPlaylistQuery.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_playlist' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcPlaylistQuery extends BaseCcPlaylistQuery {
|
||||
|
||||
} // CcPlaylistQuery
|
||||
81
application/models/campcaster/CcPlaylistcontents.php
Normal file
81
application/models/campcaster/CcPlaylistcontents.php
Normal file
@ -0,0 +1,81 @@
|
||||
<?php
|
||||
|
||||
require_once('Common.php');
|
||||
|
||||
/**
|
||||
* Skeleton subclass for representing a row from the 'cc_playlistcontents' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcPlaylistcontents extends BaseCcPlaylistcontents {
|
||||
|
||||
public function getDbFadein()
|
||||
{
|
||||
return $this->fadein;
|
||||
}
|
||||
|
||||
public function setDbFadein($time)
|
||||
{
|
||||
$this->fadein = $time;
|
||||
//$this->modifiedColumns[] = CcPlaylistcontentsPeer::FADEIN;
|
||||
Common::setTimeInSub($this, 'FADEIN', $time);
|
||||
}
|
||||
|
||||
public function getDbFadeout()
|
||||
{
|
||||
return $this->fadeout;
|
||||
}
|
||||
|
||||
public function setDbFadeout($time)
|
||||
{
|
||||
$this->fadeout = $time;
|
||||
//$this->modifiedColumns[] = CcPlaylistcontentsPeer::FADEOUT;
|
||||
Common::setTimeInSub($this, 'FADEOUT', $time);
|
||||
}
|
||||
|
||||
public function getDbCuein()
|
||||
{
|
||||
return $this->cuein;
|
||||
}
|
||||
|
||||
public function setDbCuein($time)
|
||||
{
|
||||
$this->cuein = $time;
|
||||
//$this->modifiedColumns[] = CcPlaylistcontentsPeer::CUEIN;
|
||||
Common::setTimeInSub($this, 'CUEIN', $time);
|
||||
}
|
||||
|
||||
public function getDbCueout()
|
||||
{
|
||||
return $this->cueout;
|
||||
}
|
||||
|
||||
public function setDbCueout($time)
|
||||
{
|
||||
$this->cueout = $time;
|
||||
//$this->modifiedColumns[] = CcPlaylistcontentsPeer::CUEOUT;
|
||||
Common::setTimeInSub($this, 'CUEOUT', $time);
|
||||
}
|
||||
|
||||
public function getDbCliplength()
|
||||
{
|
||||
return $this->cliplength;
|
||||
}
|
||||
|
||||
public function setDbCliplength($time)
|
||||
{
|
||||
$this->cliplength = $time;
|
||||
//$this->modifiedColumns[] = CcPlaylistcontentsPeer::CLIPLENGTH;
|
||||
Common::setTimeInSub($this, 'CLIPLENGTH', $time);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
} // CcPlaylistcontents
|
||||
18
application/models/campcaster/CcPlaylistcontentsPeer.php
Normal file
18
application/models/campcaster/CcPlaylistcontentsPeer.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_playlistcontents' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcPlaylistcontentsPeer extends BaseCcPlaylistcontentsPeer {
|
||||
|
||||
} // CcPlaylistcontentsPeer
|
||||
18
application/models/campcaster/CcPlaylistcontentsQuery.php
Normal file
18
application/models/campcaster/CcPlaylistcontentsQuery.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_playlistcontents' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcPlaylistcontentsQuery extends BaseCcPlaylistcontentsQuery {
|
||||
|
||||
} // CcPlaylistcontentsQuery
|
||||
18
application/models/campcaster/CcPref.php
Normal file
18
application/models/campcaster/CcPref.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for representing a row from the 'cc_pref' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcPref extends BaseCcPref {
|
||||
|
||||
} // CcPref
|
||||
18
application/models/campcaster/CcPrefPeer.php
Normal file
18
application/models/campcaster/CcPrefPeer.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_pref' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcPrefPeer extends BaseCcPrefPeer {
|
||||
|
||||
} // CcPrefPeer
|
||||
18
application/models/campcaster/CcPrefQuery.php
Normal file
18
application/models/campcaster/CcPrefQuery.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_pref' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcPrefQuery extends BaseCcPrefQuery {
|
||||
|
||||
} // CcPrefQuery
|
||||
18
application/models/campcaster/CcSchedule.php
Normal file
18
application/models/campcaster/CcSchedule.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for representing a row from the 'cc_schedule' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcSchedule extends BaseCcSchedule {
|
||||
|
||||
} // CcSchedule
|
||||
18
application/models/campcaster/CcSchedulePeer.php
Normal file
18
application/models/campcaster/CcSchedulePeer.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_schedule' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcSchedulePeer extends BaseCcSchedulePeer {
|
||||
|
||||
} // CcSchedulePeer
|
||||
18
application/models/campcaster/CcScheduleQuery.php
Normal file
18
application/models/campcaster/CcScheduleQuery.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_schedule' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcScheduleQuery extends BaseCcScheduleQuery {
|
||||
|
||||
} // CcScheduleQuery
|
||||
18
application/models/campcaster/CcSess.php
Normal file
18
application/models/campcaster/CcSess.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for representing a row from the 'cc_sess' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcSess extends BaseCcSess {
|
||||
|
||||
} // CcSess
|
||||
18
application/models/campcaster/CcSessPeer.php
Normal file
18
application/models/campcaster/CcSessPeer.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_sess' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcSessPeer extends BaseCcSessPeer {
|
||||
|
||||
} // CcSessPeer
|
||||
18
application/models/campcaster/CcSessQuery.php
Normal file
18
application/models/campcaster/CcSessQuery.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_sess' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcSessQuery extends BaseCcSessQuery {
|
||||
|
||||
} // CcSessQuery
|
||||
18
application/models/campcaster/CcShow.php
Normal file
18
application/models/campcaster/CcShow.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for representing a row from the 'cc_show' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcShow extends BaseCcShow {
|
||||
|
||||
} // CcShow
|
||||
18
application/models/campcaster/CcShowPeer.php
Normal file
18
application/models/campcaster/CcShowPeer.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_show' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcShowPeer extends BaseCcShowPeer {
|
||||
|
||||
} // CcShowPeer
|
||||
18
application/models/campcaster/CcShowQuery.php
Normal file
18
application/models/campcaster/CcShowQuery.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_show' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcShowQuery extends BaseCcShowQuery {
|
||||
|
||||
} // CcShowQuery
|
||||
18
application/models/campcaster/CcSmemb.php
Normal file
18
application/models/campcaster/CcSmemb.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for representing a row from the 'cc_smemb' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcSmemb extends BaseCcSmemb {
|
||||
|
||||
} // CcSmemb
|
||||
18
application/models/campcaster/CcSmembPeer.php
Normal file
18
application/models/campcaster/CcSmembPeer.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_smemb' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcSmembPeer extends BaseCcSmembPeer {
|
||||
|
||||
} // CcSmembPeer
|
||||
18
application/models/campcaster/CcSmembQuery.php
Normal file
18
application/models/campcaster/CcSmembQuery.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_smemb' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcSmembQuery extends BaseCcSmembQuery {
|
||||
|
||||
} // CcSmembQuery
|
||||
18
application/models/campcaster/CcSubjs.php
Normal file
18
application/models/campcaster/CcSubjs.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for representing a row from the 'cc_subjs' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcSubjs extends BaseCcSubjs {
|
||||
|
||||
} // CcSubjs
|
||||
18
application/models/campcaster/CcSubjsPeer.php
Normal file
18
application/models/campcaster/CcSubjsPeer.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_subjs' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcSubjsPeer extends BaseCcSubjsPeer {
|
||||
|
||||
} // CcSubjsPeer
|
||||
18
application/models/campcaster/CcSubjsQuery.php
Normal file
18
application/models/campcaster/CcSubjsQuery.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_subjs' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcSubjsQuery extends BaseCcSubjsQuery {
|
||||
|
||||
} // CcSubjsQuery
|
||||
18
application/models/campcaster/CcTrans.php
Normal file
18
application/models/campcaster/CcTrans.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for representing a row from the 'cc_trans' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcTrans extends BaseCcTrans {
|
||||
|
||||
} // CcTrans
|
||||
18
application/models/campcaster/CcTransPeer.php
Normal file
18
application/models/campcaster/CcTransPeer.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_trans' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcTransPeer extends BaseCcTransPeer {
|
||||
|
||||
} // CcTransPeer
|
||||
18
application/models/campcaster/CcTransQuery.php
Normal file
18
application/models/campcaster/CcTransQuery.php
Normal file
@ -0,0 +1,18 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Skeleton subclass for performing query and update operations on the 'cc_trans' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster
|
||||
*/
|
||||
class CcTransQuery extends BaseCcTransQuery {
|
||||
|
||||
} // CcTransQuery
|
||||
19
application/models/campcaster/Common.php
Normal file
19
application/models/campcaster/Common.php
Normal file
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
class Common {
|
||||
|
||||
public static function setTimeInSub($row, $col, $time)
|
||||
{
|
||||
$class = get_class($row).'Peer';
|
||||
|
||||
$con = Propel::getConnection($class::DATABASE_NAME);
|
||||
|
||||
$sql = 'UPDATE '.$class::TABLE_NAME
|
||||
. ' SET '.$col.' = :f1'
|
||||
. ' WHERE ' .$class::ID. ' = :p1';
|
||||
$stmt = $con->prepare($sql);
|
||||
$stmt->bindValue(':f1', $time);
|
||||
$stmt->bindValue(':p1', $row->getDbId());
|
||||
$stmt->execute();
|
||||
}
|
||||
}
|
||||
61
application/models/campcaster/map/CcAccessTableMap.php
Normal file
61
application/models/campcaster/map/CcAccessTableMap.php
Normal file
@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* This class defines the structure of the 'cc_access' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster.map
|
||||
*/
|
||||
class CcAccessTableMap extends TableMap {
|
||||
|
||||
/**
|
||||
* The (dot-path) name of this class
|
||||
*/
|
||||
const CLASS_NAME = 'campcaster.map.CcAccessTableMap';
|
||||
|
||||
/**
|
||||
* 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_access');
|
||||
$this->setPhpName('CcAccess');
|
||||
$this->setClassname('CcAccess');
|
||||
$this->setPackage('campcaster');
|
||||
$this->setUseIdGenerator(true);
|
||||
$this->setPrimaryKeyMethodInfo('cc_access_id_seq');
|
||||
// columns
|
||||
$this->addPrimaryKey('ID', 'Id', 'INTEGER', true, null, null);
|
||||
$this->addColumn('GUNID', 'Gunid', 'CHAR', false, 32, null);
|
||||
$this->addColumn('TOKEN', 'Token', 'BIGINT', false, null, null);
|
||||
$this->addColumn('CHSUM', 'Chsum', 'CHAR', true, 32, '');
|
||||
$this->addColumn('EXT', 'Ext', 'VARCHAR', true, 128, '');
|
||||
$this->addColumn('TYPE', 'Type', 'VARCHAR', true, 20, '');
|
||||
$this->addColumn('PARENT', 'Parent', 'BIGINT', false, null, null);
|
||||
$this->addForeignKey('OWNER', 'Owner', 'INTEGER', 'cc_subjs', 'ID', false, null, 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('owner' => 'id', ), null, null);
|
||||
} // buildRelations()
|
||||
|
||||
} // CcAccessTableMap
|
||||
55
application/models/campcaster/map/CcBackupTableMap.php
Normal file
55
application/models/campcaster/map/CcBackupTableMap.php
Normal file
@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* This class defines the structure of the 'cc_backup' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster.map
|
||||
*/
|
||||
class CcBackupTableMap extends TableMap {
|
||||
|
||||
/**
|
||||
* The (dot-path) name of this class
|
||||
*/
|
||||
const CLASS_NAME = 'campcaster.map.CcBackupTableMap';
|
||||
|
||||
/**
|
||||
* 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_backup');
|
||||
$this->setPhpName('CcBackup');
|
||||
$this->setClassname('CcBackup');
|
||||
$this->setPackage('campcaster');
|
||||
$this->setUseIdGenerator(false);
|
||||
// columns
|
||||
$this->addPrimaryKey('TOKEN', 'Token', 'VARCHAR', true, 64, null);
|
||||
$this->addColumn('SESSIONID', 'Sessionid', 'VARCHAR', true, 64, null);
|
||||
$this->addColumn('STATUS', 'Status', 'VARCHAR', true, 32, null);
|
||||
$this->addColumn('FROMTIME', 'Fromtime', 'TIMESTAMP', true, null, null);
|
||||
$this->addColumn('TOTIME', 'Totime', 'TIMESTAMP', true, null, null);
|
||||
// validators
|
||||
} // initialize()
|
||||
|
||||
/**
|
||||
* Build the RelationMap objects for this table relationships
|
||||
*/
|
||||
public function buildRelations()
|
||||
{
|
||||
} // buildRelations()
|
||||
|
||||
} // CcBackupTableMap
|
||||
107
application/models/campcaster/map/CcFilesTableMap.php
Normal file
107
application/models/campcaster/map/CcFilesTableMap.php
Normal file
@ -0,0 +1,107 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* This class defines the structure of the 'cc_files' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster.map
|
||||
*/
|
||||
class CcFilesTableMap extends TableMap {
|
||||
|
||||
/**
|
||||
* The (dot-path) name of this class
|
||||
*/
|
||||
const CLASS_NAME = 'campcaster.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('campcaster');
|
||||
$this->setUseIdGenerator(true);
|
||||
$this->setPrimaryKeyMethodInfo('cc_files_id_seq');
|
||||
// columns
|
||||
$this->addPrimaryKey('ID', 'DbId', 'INTEGER', true, null, null);
|
||||
$this->addColumn('GUNID', 'Gunid', 'CHAR', true, 32, null);
|
||||
$this->addColumn('NAME', 'Name', 'VARCHAR', true, 255, '');
|
||||
$this->addColumn('MIME', 'Mime', 'VARCHAR', true, 255, '');
|
||||
$this->addColumn('FTYPE', 'Ftype', 'VARCHAR', true, 128, '');
|
||||
$this->addColumn('FILEPATH', 'filepath', 'LONGVARCHAR', false, null, '');
|
||||
$this->addColumn('STATE', 'State', 'VARCHAR', true, 128, 'empty');
|
||||
$this->addColumn('CURRENTLYACCESSING', 'Currentlyaccessing', 'INTEGER', true, null, 0);
|
||||
$this->addForeignKey('EDITEDBY', 'Editedby', 'INTEGER', 'cc_subjs', 'ID', false, null, null);
|
||||
$this->addColumn('MTIME', 'Mtime', 'TIMESTAMP', false, 6, null);
|
||||
$this->addColumn('MD5', 'Md5', 'CHAR', false, 32, null);
|
||||
$this->addColumn('TRACK_TITLE', 'TrackTitle', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('ARTIST_NAME', 'ArtistName', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('BIT_RATE', 'BitRate', 'VARCHAR', false, 32, null);
|
||||
$this->addColumn('SAMPLE_RATE', 'SampleRate', 'VARCHAR', false, 32, null);
|
||||
$this->addColumn('FORMAT', 'Format', 'VARCHAR', false, 128, null);
|
||||
$this->addColumn('LENGTH', 'DbLength', 'TIME', false, null, null);
|
||||
$this->addColumn('ALBUM_TITLE', 'AlbumTitle', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('GENRE', 'Genre', 'VARCHAR', false, 64, null);
|
||||
$this->addColumn('COMMENTS', 'Comments', 'LONGVARCHAR', false, null, null);
|
||||
$this->addColumn('YEAR', 'Year', 'VARCHAR', false, 16, null);
|
||||
$this->addColumn('TRACK_NUMBER', 'TrackNumber', 'INTEGER', false, null, null);
|
||||
$this->addColumn('CHANNELS', 'Channels', 'INTEGER', false, null, null);
|
||||
$this->addColumn('URL', 'Url', 'VARCHAR', false, 1024, null);
|
||||
$this->addColumn('BPM', 'Bpm', 'VARCHAR', false, 8, null);
|
||||
$this->addColumn('RATING', 'Rating', 'VARCHAR', false, 8, null);
|
||||
$this->addColumn('ENCODED_BY', 'EncodedBy', 'VARCHAR', false, 255, null);
|
||||
$this->addColumn('DISC_NUMBER', 'DiscNumber', 'VARCHAR', false, 8, null);
|
||||
$this->addColumn('MOOD', 'Mood', 'VARCHAR', false, 64, null);
|
||||
$this->addColumn('LABEL', 'Label', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('COMPOSER', 'Composer', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('ENCODER', 'Encoder', 'VARCHAR', false, 64, null);
|
||||
$this->addColumn('CHECKSUM', 'Checksum', 'VARCHAR', false, 256, null);
|
||||
$this->addColumn('LYRICS', 'Lyrics', 'LONGVARCHAR', false, null, null);
|
||||
$this->addColumn('ORCHESTRA', 'Orchestra', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('CONDUCTOR', 'Conductor', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('LYRICIST', 'Lyricist', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('ORIGINAL_LYRICIST', 'OriginalLyricist', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('RADIO_STATION_NAME', 'RadioStationName', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('INFO_URL', 'InfoUrl', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('ARTIST_URL', 'ArtistUrl', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('AUDIO_SOURCE_URL', 'AudioSourceUrl', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('RADIO_STATION_URL', 'RadioStationUrl', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('BUY_THIS_URL', 'BuyThisUrl', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('ISRC_NUMBER', 'IsrcNumber', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('CATALOG_NUMBER', 'CatalogNumber', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('ORIGINAL_ARTIST', 'OriginalArtist', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('COPYRIGHT', 'Copyright', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('REPORT_DATETIME', 'ReportDatetime', 'VARCHAR', false, 32, null);
|
||||
$this->addColumn('REPORT_LOCATION', 'ReportLocation', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('REPORT_ORGANIZATION', 'ReportOrganization', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('SUBJECT', 'Subject', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('CONTRIBUTOR', 'Contributor', 'VARCHAR', false, 512, null);
|
||||
$this->addColumn('LANGUAGE', 'Language', 'VARCHAR', false, 512, null);
|
||||
// validators
|
||||
} // initialize()
|
||||
|
||||
/**
|
||||
* Build the RelationMap objects for this table relationships
|
||||
*/
|
||||
public function buildRelations()
|
||||
{
|
||||
$this->addRelation('CcSubjs', 'CcSubjs', RelationMap::MANY_TO_ONE, array('editedby' => 'id', ), null, null);
|
||||
$this->addRelation('CcPlaylistcontents', 'CcPlaylistcontents', RelationMap::ONE_TO_MANY, array('id' => 'file_id', ), 'CASCADE', null);
|
||||
} // buildRelations()
|
||||
|
||||
} // CcFilesTableMap
|
||||
56
application/models/campcaster/map/CcPermsTableMap.php
Normal file
56
application/models/campcaster/map/CcPermsTableMap.php
Normal file
@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* This class defines the structure of the 'cc_perms' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster.map
|
||||
*/
|
||||
class CcPermsTableMap extends TableMap {
|
||||
|
||||
/**
|
||||
* The (dot-path) name of this class
|
||||
*/
|
||||
const CLASS_NAME = 'campcaster.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('campcaster');
|
||||
$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()
|
||||
|
||||
} // CcPermsTableMap
|
||||
61
application/models/campcaster/map/CcPlaylistTableMap.php
Normal file
61
application/models/campcaster/map/CcPlaylistTableMap.php
Normal file
@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* This class defines the structure of the 'cc_playlist' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster.map
|
||||
*/
|
||||
class CcPlaylistTableMap extends TableMap {
|
||||
|
||||
/**
|
||||
* The (dot-path) name of this class
|
||||
*/
|
||||
const CLASS_NAME = 'campcaster.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('campcaster');
|
||||
$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('STATE', 'DbState', 'VARCHAR', true, 128, 'empty');
|
||||
$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('CREATOR', 'DbCreator', 'VARCHAR', false, 32, null);
|
||||
$this->addColumn('DESCRIPTION', 'DbDescription', 'VARCHAR', false, 512, null);
|
||||
// validators
|
||||
} // initialize()
|
||||
|
||||
/**
|
||||
* Build the RelationMap objects for this table relationships
|
||||
*/
|
||||
public function buildRelations()
|
||||
{
|
||||
$this->addRelation('CcSubjs', 'CcSubjs', RelationMap::MANY_TO_ONE, array('editedby' => 'id', ), null, null);
|
||||
$this->addRelation('CcPlaylistcontents', 'CcPlaylistcontents', RelationMap::ONE_TO_MANY, array('id' => 'playlist_id', ), 'CASCADE', null);
|
||||
} // buildRelations()
|
||||
|
||||
} // CcPlaylistTableMap
|
||||
@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* This class defines the structure of the 'cc_playlistcontents' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster.map
|
||||
*/
|
||||
class CcPlaylistcontentsTableMap extends TableMap {
|
||||
|
||||
/**
|
||||
* The (dot-path) name of this class
|
||||
*/
|
||||
const CLASS_NAME = 'campcaster.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('campcaster');
|
||||
$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->addColumn('POSITION', 'DbPosition', 'INTEGER', false, null, null);
|
||||
$this->addColumn('CLIPLENGTH', 'DbCliplength', 'TIME', false, null, '00:00:00');
|
||||
$this->addColumn('CUEIN', 'DbCuein', 'TIME', false, null, '00:00:00');
|
||||
$this->addColumn('CUEOUT', 'DbCueout', 'TIME', 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('CcPlaylist', 'CcPlaylist', RelationMap::MANY_TO_ONE, array('playlist_id' => 'id', ), 'CASCADE', null);
|
||||
} // buildRelations()
|
||||
|
||||
} // CcPlaylistcontentsTableMap
|
||||
56
application/models/campcaster/map/CcPrefTableMap.php
Normal file
56
application/models/campcaster/map/CcPrefTableMap.php
Normal file
@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* This class defines the structure of the 'cc_pref' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster.map
|
||||
*/
|
||||
class CcPrefTableMap extends TableMap {
|
||||
|
||||
/**
|
||||
* The (dot-path) name of this class
|
||||
*/
|
||||
const CLASS_NAME = 'campcaster.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('campcaster');
|
||||
$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()
|
||||
|
||||
} // CcPrefTableMap
|
||||
61
application/models/campcaster/map/CcScheduleTableMap.php
Normal file
61
application/models/campcaster/map/CcScheduleTableMap.php
Normal file
@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* This class defines the structure of the 'cc_schedule' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster.map
|
||||
*/
|
||||
class CcScheduleTableMap extends TableMap {
|
||||
|
||||
/**
|
||||
* The (dot-path) name of this class
|
||||
*/
|
||||
const CLASS_NAME = 'campcaster.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('campcaster');
|
||||
$this->setUseIdGenerator(false);
|
||||
// columns
|
||||
$this->addPrimaryKey('ID', 'Id', 'BIGINT', true, null, null);
|
||||
$this->addColumn('PLAYLIST_ID', 'PlaylistId', 'INTEGER', true, null, null);
|
||||
$this->addColumn('STARTS', 'Starts', 'TIMESTAMP', true, null, null);
|
||||
$this->addColumn('ENDS', 'Ends', 'TIMESTAMP', true, null, null);
|
||||
$this->addColumn('GROUP_ID', 'GroupId', 'INTEGER', false, null, null);
|
||||
$this->addColumn('FILE_ID', 'FileId', 'INTEGER', false, null, null);
|
||||
$this->addColumn('CLIP_LENGTH', 'ClipLength', 'TIME', false, null, '00:00:00');
|
||||
$this->addColumn('FADE_IN', 'FadeIn', 'TIME', false, null, '00:00:00');
|
||||
$this->addColumn('FADE_OUT', 'FadeOut', 'TIME', false, null, '00:00:00');
|
||||
$this->addColumn('CUE_IN', 'CueIn', 'TIME', false, null, '00:00:00');
|
||||
$this->addColumn('CUE_OUT', 'CueOut', 'TIME', false, null, '00:00:00');
|
||||
// validators
|
||||
} // initialize()
|
||||
|
||||
/**
|
||||
* Build the RelationMap objects for this table relationships
|
||||
*/
|
||||
public function buildRelations()
|
||||
{
|
||||
} // buildRelations()
|
||||
|
||||
} // CcScheduleTableMap
|
||||
55
application/models/campcaster/map/CcSessTableMap.php
Normal file
55
application/models/campcaster/map/CcSessTableMap.php
Normal file
@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* This class defines the structure of the 'cc_sess' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster.map
|
||||
*/
|
||||
class CcSessTableMap extends TableMap {
|
||||
|
||||
/**
|
||||
* The (dot-path) name of this class
|
||||
*/
|
||||
const CLASS_NAME = 'campcaster.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('campcaster');
|
||||
$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()
|
||||
|
||||
} // CcSessTableMap
|
||||
60
application/models/campcaster/map/CcShowTableMap.php
Normal file
60
application/models/campcaster/map/CcShowTableMap.php
Normal file
@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* This class defines the structure of the 'cc_show' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster.map
|
||||
*/
|
||||
class CcShowTableMap extends TableMap {
|
||||
|
||||
/**
|
||||
* The (dot-path) name of this class
|
||||
*/
|
||||
const CLASS_NAME = 'campcaster.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('campcaster');
|
||||
$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('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('END_TIME', 'DbEndTime', 'TIME', true, null, null);
|
||||
$this->addColumn('REPEATS', 'DbRepeats', 'TINYINT', true, null, null);
|
||||
$this->addColumn('DAY', 'DbDay', 'TINYINT', true, null, null);
|
||||
$this->addColumn('DESCRIPTION', 'DbDescription', 'VARCHAR', false, 512, null);
|
||||
// validators
|
||||
} // initialize()
|
||||
|
||||
/**
|
||||
* Build the RelationMap objects for this table relationships
|
||||
*/
|
||||
public function buildRelations()
|
||||
{
|
||||
} // buildRelations()
|
||||
|
||||
} // CcShowTableMap
|
||||
55
application/models/campcaster/map/CcSmembTableMap.php
Normal file
55
application/models/campcaster/map/CcSmembTableMap.php
Normal file
@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* This class defines the structure of the 'cc_smemb' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster.map
|
||||
*/
|
||||
class CcSmembTableMap extends TableMap {
|
||||
|
||||
/**
|
||||
* The (dot-path) name of this class
|
||||
*/
|
||||
const CLASS_NAME = 'campcaster.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('campcaster');
|
||||
$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()
|
||||
|
||||
} // CcSmembTableMap
|
||||
63
application/models/campcaster/map/CcSubjsTableMap.php
Normal file
63
application/models/campcaster/map/CcSubjsTableMap.php
Normal file
@ -0,0 +1,63 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* This class defines the structure of the 'cc_subjs' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster.map
|
||||
*/
|
||||
class CcSubjsTableMap extends TableMap {
|
||||
|
||||
/**
|
||||
* The (dot-path) name of this class
|
||||
*/
|
||||
const CLASS_NAME = 'campcaster.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('campcaster');
|
||||
$this->setUseIdGenerator(false);
|
||||
// columns
|
||||
$this->addPrimaryKey('ID', 'Id', 'INTEGER', true, null, null);
|
||||
$this->addColumn('LOGIN', 'Login', 'VARCHAR', true, 255, '');
|
||||
$this->addColumn('PASS', 'Pass', 'VARCHAR', true, 255, '');
|
||||
$this->addColumn('TYPE', 'Type', 'CHAR', true, 1, 'U');
|
||||
$this->addColumn('REALNAME', 'Realname', 'VARCHAR', true, 255, '');
|
||||
$this->addColumn('LASTLOGIN', 'Lastlogin', 'TIMESTAMP', false, null, null);
|
||||
$this->addColumn('LASTFAIL', 'Lastfail', 'TIMESTAMP', false, null, null);
|
||||
// validators
|
||||
} // initialize()
|
||||
|
||||
/**
|
||||
* Build the RelationMap objects for this table relationships
|
||||
*/
|
||||
public function buildRelations()
|
||||
{
|
||||
$this->addRelation('CcAccess', 'CcAccess', RelationMap::ONE_TO_MANY, array('id' => 'owner', ), null, null);
|
||||
$this->addRelation('CcFiles', '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('CcPlaylist', 'CcPlaylist', RelationMap::ONE_TO_MANY, array('id' => 'editedby', ), null, 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);
|
||||
} // buildRelations()
|
||||
|
||||
} // CcSubjsTableMap
|
||||
75
application/models/campcaster/map/CcTransTableMap.php
Normal file
75
application/models/campcaster/map/CcTransTableMap.php
Normal file
@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* This class defines the structure of the 'cc_trans' table.
|
||||
*
|
||||
*
|
||||
*
|
||||
* 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.campcaster.map
|
||||
*/
|
||||
class CcTransTableMap extends TableMap {
|
||||
|
||||
/**
|
||||
* The (dot-path) name of this class
|
||||
*/
|
||||
const CLASS_NAME = 'campcaster.map.CcTransTableMap';
|
||||
|
||||
/**
|
||||
* 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_trans');
|
||||
$this->setPhpName('CcTrans');
|
||||
$this->setClassname('CcTrans');
|
||||
$this->setPackage('campcaster');
|
||||
$this->setUseIdGenerator(true);
|
||||
$this->setPrimaryKeyMethodInfo('cc_trans_id_seq');
|
||||
// columns
|
||||
$this->addPrimaryKey('ID', 'Id', 'INTEGER', true, null, null);
|
||||
$this->addColumn('TRTOK', 'Trtok', 'CHAR', true, 16, null);
|
||||
$this->addColumn('DIRECTION', 'Direction', 'VARCHAR', true, 128, null);
|
||||
$this->addColumn('STATE', 'State', 'VARCHAR', true, 128, null);
|
||||
$this->addColumn('TRTYPE', 'Trtype', 'VARCHAR', true, 128, null);
|
||||
$this->addColumn('LOCK', 'Lock', 'CHAR', true, 1, 'N');
|
||||
$this->addColumn('TARGET', 'Target', 'VARCHAR', false, 255, null);
|
||||
$this->addColumn('RTRTOK', 'Rtrtok', 'CHAR', false, 16, null);
|
||||
$this->addColumn('MDTRTOK', 'Mdtrtok', 'CHAR', false, 16, null);
|
||||
$this->addColumn('GUNID', 'Gunid', 'CHAR', false, 32, null);
|
||||
$this->addColumn('PDTOKEN', 'Pdtoken', 'BIGINT', false, null, null);
|
||||
$this->addColumn('URL', 'Url', 'VARCHAR', false, 255, null);
|
||||
$this->addColumn('LOCALFILE', 'Localfile', 'VARCHAR', false, 255, null);
|
||||
$this->addColumn('FNAME', 'Fname', 'VARCHAR', false, 255, null);
|
||||
$this->addColumn('TITLE', 'Title', 'VARCHAR', false, 255, null);
|
||||
$this->addColumn('EXPECTEDSUM', 'Expectedsum', 'CHAR', false, 32, null);
|
||||
$this->addColumn('REALSUM', 'Realsum', 'CHAR', false, 32, null);
|
||||
$this->addColumn('EXPECTEDSIZE', 'Expectedsize', 'INTEGER', false, null, null);
|
||||
$this->addColumn('REALSIZE', 'Realsize', 'INTEGER', false, null, null);
|
||||
$this->addColumn('UID', 'Uid', 'INTEGER', false, null, null);
|
||||
$this->addColumn('ERRMSG', 'Errmsg', 'VARCHAR', false, 255, null);
|
||||
$this->addColumn('JOBPID', 'Jobpid', 'INTEGER', false, null, null);
|
||||
$this->addColumn('START', 'Start', 'TIMESTAMP', false, null, null);
|
||||
$this->addColumn('TS', 'Ts', 'TIMESTAMP', false, null, null);
|
||||
// validators
|
||||
} // initialize()
|
||||
|
||||
/**
|
||||
* Build the RelationMap objects for this table relationships
|
||||
*/
|
||||
public function buildRelations()
|
||||
{
|
||||
} // buildRelations()
|
||||
|
||||
} // CcTransTableMap
|
||||
1236
application/models/campcaster/om/BaseCcAccess.php
Normal file
1236
application/models/campcaster/om/BaseCcAccess.php
Normal file
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user