diff --git a/api/api_version.php b/api/api_version.php
new file mode 100644
index 000000000..350f477d9
--- /dev/null
+++ b/api/api_version.php
@@ -0,0 +1,13 @@
+CAMPCASTER_VERSION));
+?>
\ No newline at end of file
diff --git a/api/get_media.php b/api/get_media.php
new file mode 100644
index 000000000..824d7b453
--- /dev/null
+++ b/api/get_media.php
@@ -0,0 +1,38 @@
+getMessage()." ".$CC_DBC->getUserInfo()."\n";
+ exit(1);
+}
+$CC_DBC->setFetchMode(DB_FETCHMODE_ASSOC);
+
+$file_id = $_GET[""]
+if(!is_file($src))
+{
+ header($_SERVER["SERVER_PROTOCOL"]." 404 Not Found");
+ //print 'Ressource in database, but not in storage. Sorry.';
+ exit;
+}
+
+// !! binary mode !!
+$fp = fopen($src, 'rb');
+
+header("Content-Type: audio/mpeg");
+header("Content-Length: " . filesize($src));
+
+fpassthru($fp);
+exit;
+?>
\ No newline at end of file
diff --git a/api/schedule.php b/api/schedule.php
new file mode 100644
index 000000000..14f9247bf
--- /dev/null
+++ b/api/schedule.php
@@ -0,0 +1,25 @@
+getMessage()." ".$CC_DBC->getUserInfo()."\n";
+ exit(1);
+}
+$CC_DBC->setFetchMode(DB_FETCHMODE_ASSOC);
+$from = $_GET["from"];
+$to = $_GET["to"];
+echo Schedule::ExportRangeAsJson($from, $to);
+?>
\ No newline at end of file
diff --git a/backend/BasicStor.php b/backend/BasicStor.php
index 4d4e2734a..ef9ffd6c6 100644
--- a/backend/BasicStor.php
+++ b/backend/BasicStor.php
@@ -935,6 +935,9 @@ class BasicStor {
if (!is_array($values)) {
$values = array($values);
}
+ if (count($values) == 0) {
+ return true;
+ }
if (is_a($id, "StoredFile")) {
$storedFile =& $id;
} else {
@@ -949,10 +952,31 @@ class BasicStor {
if ($category == 'dcterms:extent') {
$oneValue = BasicStor::NormalizeExtent($oneValue);
}
- $escapedValue = pg_escape_string($oneValue);
- $sqlValues[] = "$columnName = '$escapedValue'";
+ // Since track_number is an integer, you cannot set
+ // it to be the empty string, so we NULL it instead.
+ if ($columnName == 'track_number' && empty($oneValue)) {
+ $sqlPart = "$columnName = NULL";
+ } elseif (($columnName == 'length') && (strlen($oneValue) > 8)) {
+ // Postgres doesnt like it if you try to store really large hour
+ // values. TODO: We need to fix the underlying problem of getting the
+ // right values.
+ $parts = explode(':', $oneValue);
+ $hour = intval($parts[0]);
+ if ($hour > 24) {
+ continue;
+ } else {
+ $sqlPart = "$columnName = '$oneValue'";
+ }
+ } else {
+ $escapedValue = pg_escape_string($oneValue);
+ $sqlPart = "$columnName = '$escapedValue'";
+ }
+ $sqlValues[] = $sqlPart;
}
}
+ if (count($sqlValues)==0) {
+ return TRUE;
+ }
$sql = "UPDATE ".$CC_CONFIG["filesTable"]
." SET ".join(",", $sqlValues)
." WHERE id=$id";
diff --git a/backend/StoredFile.php b/backend/StoredFile.php
index 28de8b0dd..d0fd7d78b 100644
--- a/backend/StoredFile.php
+++ b/backend/StoredFile.php
@@ -1,6 +1,7 @@
gunid = $p_gunid;
if (empty($this->gunid)) {
- $this->gunid = StoredFile::CreateGunid();
+ $this->gunid = StoredFile::generateGunid();
}
- $this->resDir = $this->_getResDir($this->gunid);
- $this->filepath = "{$this->resDir}/{$this->gunid}";
+ //$this->resDir = $this->_getResDir($this->gunid);
+ //$this->filepath = "{$this->resDir}/{$this->gunid}";
$this->exists = is_file($this->filepath) && is_readable($this->filepath);
$this->md = $this->loadMetadata();
}
@@ -401,7 +402,7 @@ class StoredFile {
global $CC_CONFIG, $CC_DBC;
$escapedValue = pg_escape_string($this->gunid);
$sql = "SELECT * FROM ".$CC_CONFIG["filesTable"]
- ." WHERE gunid=x'$escapedValue'::bigint";
+ ." WHERE gunid='$escapedValue'";
//var_dump($sql);
$this->md = $CC_DBC->getRow($sql);
if (PEAR::isError($this->md)) {
@@ -409,6 +410,7 @@ class StoredFile {
$this->md = null;
return $error;
}
+ $this->filepath = $this->md["filepath"];
if (is_null($this->md)) {
$this->md = array();
return;
@@ -465,7 +467,7 @@ class StoredFile {
* Create instance of StoredFile object and insert new file
*
* @param array $p_values
- * "filepath" - required, local path to media file
+ * "filepath" - required, local path to media file (where it is before import)
* "id" - optional, local object id, will be generated if not given
* "gunid" - optional, unique id, for insert file with gunid, will be generated if not given
* "filename" - optional, will use "filepath" if not given
@@ -503,9 +505,9 @@ class StoredFile {
}
$storedFile->name = isset($p_values['filename']) ? $p_values['filename'] : $p_values["filepath"];
- // NOTE: POSTGRES-SPECIFIC KEYWORD "DEFAULT" BEING USED, WOULD BE "NULL" IN MYSQL
$storedFile->id = isset($p_values['id']) && is_integer($p_values['id'])?(int)$p_values['id']:null;
- $sqlId = !is_null($storedFile->id)?"'".$storedFile->id."'":'DEFAULT';
+ // NOTE: POSTGRES-SPECIFIC KEYWORD "DEFAULT" BEING USED, WOULD BE "NULL" IN MYSQL
+ $sqlId = !is_null($storedFile->id)?"'".$storedFile->id."'":'DEFAULT';
$storedFile->ftype = isset($p_values['filetype']) ? strtolower($p_values['filetype']) : "audioclip";
$storedFile->mime = (isset($p_values["mime"]) ? $p_values["mime"] : NULL );
// $storedFile->filepath = $p_values['filepath'];
@@ -531,7 +533,7 @@ class StoredFile {
$sql = "INSERT INTO ".$CC_CONFIG['filesTable']
."(id, name, gunid, mime, state, ftype, mtime, md5)"
."VALUES ({$sqlId}, '{$escapedName}', "
- ." x'{$storedFile->gunid}'::bigint,"
+ ." '{$storedFile->gunid}',"
." '{$storedFile->mime}', 'incomplete', '$escapedFtype',"
." now(), '{$storedFile->md5}')";
//$_SESSION["debug"] .= "sql: ".$sql."
";
@@ -550,6 +552,7 @@ class StoredFile {
// Save media file
$res = $storedFile->addFile($p_values['filepath'], $p_copyMedia);
+
if (PEAR::isError($res)) {
echo "StoredFile::Insert: ERROR adding file: '".$res->getMessage()."'\n";
$CC_DBC->query("ROLLBACK");
@@ -596,17 +599,18 @@ class StoredFile {
if (!is_null($p_oid)) {
$cond = "id='".intval($p_oid)."'";
} elseif (!is_null($p_gunid)) {
- $cond = "gunid=x'$p_gunid'::bigint";
+ $cond = "gunid='$p_gunid'";
} elseif (!is_null($p_md5sum)) {
$cond = "md5='$p_md5sum'";
} else {
return null;
}
- $sql = "SELECT id, to_hex(gunid)as gunid, gunid as gunid_bigint,"
+ $sql = "SELECT id, gunid,"
." name, mime, ftype, state, currentlyaccessing, editedby, "
." mtime, md5"
." FROM ".$CC_CONFIG['filesTable']
." WHERE $cond";
+ //echo $sql;
$row = $CC_DBC->getRow($sql);
if (PEAR::isError($row)) {
return $row;
@@ -614,7 +618,7 @@ class StoredFile {
if (is_null($row)) {
return null;
}
- $gunid = StoredFile::NormalizeGunid($row['gunid']);
+ $gunid = $row['gunid'];
if ($row['ftype'] == 'audioclip') {
$storedFile = new StoredFile($gunid);
} elseif ($row['ftype'] == 'playlist') {
@@ -623,9 +627,9 @@ class StoredFile {
$storedFile = new StoredFile($gunid);
}
$storedFile->loadMetadata();
- $storedFile->gunidBigint = $row['gunid_bigint'];
+ //$storedFile->gunidBigint = $row['gunid_bigint'];
//$storedFile->md->gunidBigint = $row['gunid_bigint'];
- $storedFile->md["gunid"] = $row['gunid_bigint'];
+ $storedFile->md["gunid"] = $row['gunid'];
$storedFile->id = $row['id'];
$storedFile->name = $row['name'];
$storedFile->mime = $row['mime'];
@@ -678,7 +682,7 @@ class StoredFile {
public static function RecallByToken($p_token)
{
global $CC_CONFIG, $CC_DBC;
- $sql = "SELECT to_hex(gunid) as gunid"
+ $sql = "SELECT gunid"
." FROM ".$CC_CONFIG['accessTable']
." WHERE token=x'$p_token'::bigint";
$gunid = $CC_DBC->getOne($sql);
@@ -689,11 +693,28 @@ class StoredFile {
return PEAR::raiseError(
"StoredFile::RecallByToken: invalid token ($p_token)", GBERR_AOBJNEX);
}
- $gunid = StoredFile::NormalizeGunid($gunid);
return StoredFile::Recall(null, $gunid);
}
+ /**
+ * Generate the location to store the file.
+ * It creates the subdirectory if needed.
+ */
+ private function generateFilePath()
+ {
+ global $CC_CONFIG, $CC_DBC;
+ $resDir = $CC_CONFIG['storageDir']."/".substr($this->gunid, 0, 3);
+ // see Transport::_getResDir too for resDir name create code
+ if (!is_dir($resDir)) {
+ mkdir($resDir, 02775);
+ chmod($resDir, 02775);
+ }
+ $info = pathinfo($this->name);
+ $fileExt = strtolower($info["extension"]);
+ return "{$resDir}/{$this->gunid}.{$fileExt}";
+ }
+
/**
* Insert media file to filesystem
*
@@ -705,30 +726,43 @@ class StoredFile {
*/
public function addFile($p_localFilePath, $p_copyMedia=TRUE)
{
+ global $CC_CONFIG, $CC_DBC;
if ($this->exists) {
return FALSE;
}
- // for files downloaded from archive:
+ // for files downloaded from remote instance:
if ($p_localFilePath == $this->filepath) {
$this->exists = TRUE;
return TRUE;
}
umask(0002);
+ $dstFile = '';
if ($p_copyMedia) {
- $r = @copy($p_localFilePath, $this->filepath);
+ $dstFile = $this->generateFilePath();
+ $r = @copy($p_localFilePath, $dstFile);
+ if (!$r) {
+ $this->exists = FALSE;
+ return PEAR::raiseError(
+ "StoredFile::addFile: file save failed".
+ " ($p_localFilePath, {$this->filepath})",GBERR_FILEIO
+ );
+ }
} else {
- $r = @symlink($p_localFilePath, $this->filepath);
+ $dstFile = $p_localFilePath;
+ $r = TRUE;
+ //$r = @symlink($p_localFilePath, $dstFile);
}
- if ($r) {
- $this->exists = TRUE;
- return TRUE;
- } else {
- $this->exists = FALSE;
- return PEAR::raiseError(
- "StoredFile::addFile: file save failed".
- " ($p_localFilePath, {$this->filepath})",GBERR_FILEIO
- );
+ $this->filepath = $dstFile;
+ $sqlPath = pg_escape_string($this->filepath);
+ $sql = "UPDATE ".$CC_CONFIG["filesTable"]
+ ." SET filepath='{$sqlPath}'"
+ ." WHERE id={$this->id}";
+ $res = $CC_DBC->query($sql);
+ if (PEAR::isError($res)) {
+ return $res;
}
+ $this->exists = TRUE;
+ return TRUE;
}
@@ -1013,7 +1047,7 @@ class StoredFile {
$escapedName = pg_escape_string($p_newname);
$sql = "UPDATE ".$CC_CONFIG['filesTable']
." SET name='$escapedName', mtime=now()"
- ." WHERE gunid=x'{$this->gunid}'::bigint";
+ ." WHERE gunid='{$this->gunid}'";
$res = $CC_DBC->query($sql);
if (PEAR::isError($res)) {
return $res;
@@ -1039,7 +1073,7 @@ class StoredFile {
$eb = (!is_null($p_editedby) ? ", editedBy=$p_editedby" : '');
$sql = "UPDATE ".$CC_CONFIG['filesTable']
." SET state='$escapedState'$eb, mtime=now()"
- ." WHERE gunid=x'{$this->gunid}'::bigint";
+ ." WHERE gunid='{$this->gunid}'";
$res = $CC_DBC->query($sql);
if (PEAR::isError($res)) {
return $res;
@@ -1065,7 +1099,7 @@ class StoredFile {
$escapedMime = pg_escape_string($p_mime);
$sql = "UPDATE ".$CC_CONFIG['filesTable']
." SET mime='$escapedMime', mtime=now()"
- ." WHERE gunid=x'{$this->gunid}'::bigint";
+ ." WHERE gunid='{$this->gunid}'";
$res = $CC_DBC->query($sql);
if (PEAR::isError($res)) {
return $res;
@@ -1087,7 +1121,7 @@ class StoredFile {
$escapedMd5 = pg_escape_string($p_md5sum);
$sql = "UPDATE ".$CC_CONFIG['filesTable']
." SET md5='$escapedMd5', mtime=now()"
- ." WHERE gunid=x'{$this->gunid}'::bigint";
+ ." WHERE gunid='{$this->gunid}'";
$res = $CC_DBC->query($sql);
if (PEAR::isError($res)) {
return $res;
@@ -1119,7 +1153,7 @@ class StoredFile {
// }
$sql = "SELECT to_hex(token)as token, ext "
." FROM ".$CC_CONFIG['accessTable']
- ." WHERE gunid=x'{$this->gunid}'::bigint";
+ ." WHERE gunid='{$this->gunid}'";
$tokens = $CC_DBC->getAll($sql);
if (is_array($tokens)) {
foreach ($tokens as $i => $item) {
@@ -1130,13 +1164,13 @@ class StoredFile {
}
}
$sql = "DELETE FROM ".$CC_CONFIG['accessTable']
- ." WHERE gunid=x'{$this->gunid}'::bigint";
+ ." WHERE gunid='{$this->gunid}'";
$res = $CC_DBC->query($sql);
if (PEAR::isError($res)) {
return $res;
}
$sql = "DELETE FROM ".$CC_CONFIG['filesTable']
- ." WHERE gunid=x'{$this->gunid}'::bigint";
+ ." WHERE gunid='{$this->gunid}'";
$res = $CC_DBC->query($sql);
if (PEAR::isError($res)) {
return $res;
@@ -1182,7 +1216,7 @@ class StoredFile {
return ($this->currentlyaccessing > 0);
}
$sql = "SELECT currentlyAccessing FROM ".$CC_CONFIG['filesTable']
- ." WHERE gunid=x'$p_gunid'::bigint";
+ ." WHERE gunid='$p_gunid'";
$ca = $CC_DBC->getOne($sql);
if (is_null($ca)) {
return PEAR::raiseError(
@@ -1229,7 +1263,7 @@ class StoredFile {
$p_playlistId = $this->gunid;
}
$sql = "SELECT editedBy FROM ".$CC_CONFIG['filesTable']
- ." WHERE gunid=x'$p_playlistId'::bigint";
+ ." WHERE gunid='$p_playlistId'";
$ca = $CC_DBC->getOne($sql);
if (PEAR::isError($ca)) {
return $ca;
@@ -1270,9 +1304,9 @@ class StoredFile {
public function exists()
{
global $CC_CONFIG, $CC_DBC;
- $sql = "SELECT to_hex(gunid) "
+ $sql = "SELECT gunid "
." FROM ".$CC_CONFIG['filesTable']
- ." WHERE gunid=x'{$this->gunid}'::bigint";
+ ." WHERE gunid='{$this->gunid}'";
$indb = $CC_DBC->getRow($sql);
if (PEAR::isError($indb)) {
return $indb;
@@ -1291,15 +1325,17 @@ class StoredFile {
* Create new global unique id
* @return string
*/
- public static function CreateGunid()
+ public static function generateGunid()
{
- $ip = (isset($_SERVER['SERVER_ADDR']) ? $_SERVER['SERVER_ADDR'] : '');
- $initString = microtime().$ip.rand()."org.mdlf.campcaster";
- $hash = md5($initString);
- // non-negative int8
- $hsd = substr($hash, 0, 1);
- $res = dechex(hexdec($hsd)>>1).substr($hash, 1, 15);
- return StoredFile::NormalizeGunid($res);
+ return md5(uniqid("", true));
+
+// $ip = (isset($_SERVER['SERVER_ADDR']) ? $_SERVER['SERVER_ADDR'] : '');
+// $initString = microtime().$ip.rand();
+// $hash = md5($initString);
+// // non-negative int8
+// $hsd = substr($hash, 0, 1);
+// $res = dechex(hexdec($hsd)>>1).substr($hash, 1, 15);
+// return StoredFile::NormalizeGunid($res);
}
@@ -1308,10 +1344,10 @@ class StoredFile {
*
* @return string
*/
- public static function NormalizeGunid($p_gunid)
- {
- return str_pad($p_gunid, 16, "0", STR_PAD_LEFT);
- }
+// public static function NormalizeGunid($p_gunid)
+// {
+// return str_pad($p_gunid, 16, "0", STR_PAD_LEFT);
+// }
/**
@@ -1386,7 +1422,7 @@ class StoredFile {
return $this->state;
}
$sql = "SELECT state FROM ".$CC_CONFIG['filesTable']
- ." WHERE gunid=x'$p_gunid'::bigint";
+ ." WHERE gunid='$p_gunid'";
return $CC_DBC->getOne($sql);
}
@@ -1405,7 +1441,7 @@ class StoredFile {
return $this->name;
}
$sql = "SELECT name FROM ".$CC_CONFIG['filesTable']
- ." WHERE gunid=x'$p_gunid'::bigint";
+ ." WHERE gunid='$p_gunid'";
return $CC_DBC->getOne($sql);
}
@@ -1416,18 +1452,18 @@ class StoredFile {
*
* @return string
*/
- private function _getResDir()
- {
- global $CC_CONFIG, $CC_DBC;
- $resDir = $CC_CONFIG['storageDir']."/".substr($this->gunid, 0, 3);
- //$this->gb->debugLog("$resDir");
- // see Transport::_getResDir too for resDir name create code
- if (!is_dir($resDir)) {
- mkdir($resDir, 02775);
- chmod($resDir, 02775);
- }
- return $resDir;
- }
+// private function _getResDir()
+// {
+// global $CC_CONFIG, $CC_DBC;
+// $resDir = $CC_CONFIG['storageDir']."/".substr($this->gunid, 0, 3);
+// //$this->gb->debugLog("$resDir");
+// // see Transport::_getResDir too for resDir name create code
+// if (!is_dir($resDir)) {
+// mkdir($resDir, 02775);
+// chmod($resDir, 02775);
+// }
+// return $resDir;
+// }
/**
@@ -1472,7 +1508,6 @@ class StoredFile {
private function _getAccessFileName($p_token, $p_ext='EXT')
{
global $CC_CONFIG;
- $token = StoredFile::NormalizeGunid($p_token);
return $CC_CONFIG['accessDir']."/$p_token.$p_ext";
}
diff --git a/backend/propel-db/build/sql/schema.sql b/backend/propel-db/build/sql/schema.sql
index a04acadbc..401ce4dd3 100644
--- a/backend/propel-db/build/sql/schema.sql
+++ b/backend/propel-db/build/sql/schema.sql
@@ -9,7 +9,7 @@ DROP TABLE "cc_access" CASCADE;
CREATE TABLE "cc_access"
(
"id" serial NOT NULL,
- "gunid" INT8,
+ "gunid" CHAR(32),
"token" INT8,
"chsum" CHAR(32) default '' NOT NULL,
"ext" VARCHAR(128) default '' NOT NULL,
@@ -61,10 +61,11 @@ DROP TABLE "cc_files" CASCADE;
CREATE TABLE "cc_files"
(
"id" serial NOT NULL,
- "gunid" INT8 NOT NULL,
+ "gunid" CHAR(32) NOT NULL,
"name" VARCHAR(255) default '' NOT NULL,
"mime" VARCHAR(255) default '' NOT NULL,
"ftype" VARCHAR(128) default '' NOT NULL,
+ "filepath" TEXT default '',
"state" VARCHAR(128) default 'empty' NOT NULL,
"currentlyaccessing" INTEGER default 0 NOT NULL,
"editedby" INTEGER,
@@ -339,7 +340,7 @@ CREATE TABLE "cc_trans"
"target" VARCHAR(255),
"rtrtok" CHAR(16),
"mdtrtok" CHAR(16),
- "gunid" INT8,
+ "gunid" CHAR(32),
"pdtoken" INT8,
"url" VARCHAR(255),
"localfile" VARCHAR(255),
diff --git a/backend/propel-db/schema.xml b/backend/propel-db/schema.xml
index 6998002ed..565137772 100644
--- a/backend/propel-db/schema.xml
+++ b/backend/propel-db/schema.xml
@@ -3,7 +3,7 @@
-
+
+
@@ -232,7 +233,7 @@
-
+
diff --git a/backend/CleanStor.php b/utils/CleanStor.php
similarity index 98%
rename from backend/CleanStor.php
rename to utils/CleanStor.php
index 7146a5642..7099944a8 100644
--- a/backend/CleanStor.php
+++ b/utils/CleanStor.php
@@ -12,7 +12,7 @@ if (isset($arr["DOCUMENT_ROOT"]) && ($arr["DOCUMENT_ROOT"] != "") ) {
require_once('../conf.php');
require_once('DB.php');
require_once('../install/installInit.php');
-require_once ('StoredFile.php');
+require_once('../backend/StoredFile.php');
function printUsage() {
@@ -118,4 +118,4 @@ switch($argv[1]){
}
-?>
\ No newline at end of file
+?>
diff --git a/utils/CleanStor.sh b/utils/CleanStor.sh
index 3103b06ae..5a5ac5bd8 100755
--- a/utils/CleanStor.sh
+++ b/utils/CleanStor.sh
@@ -23,7 +23,4 @@
#-------------------------------------------------------------------------------
# This script cleans audio files in the Campcaster storageServer.
-reldir=`dirname $0`/..
-cd $reldir/var
-
php -q CleanStor.php "$@" || exit 1
diff --git a/utils/campcaster-import.php b/utils/campcaster-import.php
index 34d308bb6..e4e0f5d67 100644
--- a/utils/campcaster-import.php
+++ b/utils/campcaster-import.php
@@ -137,7 +137,7 @@ function camp_import_audio_file($p_filepath, $p_importMode = null, $p_testOnly =
// Check for non-supported file type
if (!preg_match('/\.(ogg|mp3)$/i', $p_filepath, $var)) {
- echo "IGNORED: $p_filepath\n";
+ echo "IGNORED: [xxxxx] $p_filepath\n";
//echo " * WARNING: File extension not supported - skipping file: $p_filepath\n";
return;
}