00001 <?php
00002
00022 abstract class TSDLeaf extends TSDObject {
00023 protected $realID = '';
00024 protected $alignTable = '';
00025
00039 public function __construct($table, $attrs, $idname, $id, $alignTable, $realIdname) {
00040 parent::__construct($table, $attrs, $idname, $id);
00041 $this->realID = $realIdname;
00042 $this->alignTable = $alignTable;
00043 }
00044
00061 public function listAlignments($what = TSD::MODE_APPROVED, $cnt = false) {
00062 $id = $this->get($this->getUnique());
00063
00064 $state = 'live';
00065
00066 if (SConfig::getDefault('common.server') == 'newdev') {
00067 $state = 'dev';
00068 } else if (SConfig::getDefault('common.server') == 'www') {
00069 $state = 'live';
00070 }
00071
00072 if($cnt)
00073 $query = "SELECT COUNT(*) FROM $this->alignTable WHERE $this->realID = '" . mysql_escape_string($id) . "'";
00074 else
00075 $query = "SELECT $this->alignTable.resourceId, $this->alignTable.version, $this->alignTable.status, "
00076 . "$this->alignTable.reason FROM " . $this->alignTable
00077 . " LEFT JOIN SDRResourceCache ON SDRResourceCache.cserdId = $this->alignTable.resourceId"
00078 . " WHERE $this->realID = '" . mysql_escape_string($id) . "'";
00079
00080 switch($what) {
00081 case TSD::MODE_LIVE:
00082 $query .= ' AND version = \'LIVE\'';
00083 break;
00084 case TSD::MODE_DEV:
00085 $query .= ' AND version = \'DEV\'';
00086 break;
00087 case TSD::MODE_DEV_ACTIVE:
00088 $query .= ' AND version = \'DEV\' AND status <> \'DELETED\'';
00089 break;
00090 case TSD::MODE_DEV_UNAPPROVED:
00091 $query .= ' AND version = \'DEV\' AND status <> \'APPROVED\'';
00092 break;
00093 case TSD::MODE_NEW:
00094 $query .= ' AND version = \'DEV\' AND status = \'NEW\'';
00095 break;
00096 case TSD::MODE_CHANGED:
00097 $query .= ' AND version = \'DEV\' AND status = \'CHANGED\'';
00098 break;
00099 case TSD::MODE_DELETED:
00100 $query .= ' AND version = \'DEV\' AND status = \'DELETED\'';
00101 break;
00102 case TSD::MODE_APPROVED:
00103 $query .= ' AND version = \'DEV\' AND status = \'APPROVED\'';
00104 break;
00105 case TSD::MODE_ALL:
00106 $query .= '';
00107 break;
00108 }
00109 $query .= ' AND SDRResourceCache.' . $state .'VersionId IS NOT NULL' .
00110 ' ORDER BY version ASC, status ASC, resourceId ASC';
00111 $result = $this->DBI->query($query);
00112 if(count($this->DBI->getError()) > 0) {
00113 $this->setError('DB error(s): ' . implode('; ', $this->DBI->getError()));
00114 return null;
00115 }
00116
00117 $out = array();
00118 foreach($result as $r) {
00119 $record = array(
00120 'id' => $r['resourceId'],
00121 'reason' => $r['reason'],
00122 'version' => $r['version'],
00123 'status' => $r['status']
00124 );
00125
00126 $out[] = $record;
00127 }
00128
00129 return $out;
00130 }
00131
00148 public function align($urlOrId, $reason = '') {
00149 if(!TSD::can('align')) {
00150 $this->setError('Permission denied');
00151 return false;
00152 }
00153 if(($id = self::getCWISID($urlOrId)) === false) {
00154 $this->setError('No such URL or ID: ' . $urlOrId);
00155 return false;
00156 }
00157 $idname = $this->realID;
00158 $oid = $this->get($this->getUnique());
00159
00160
00161 $query = "SELECT COUNT(*) FROM $this->alignTable WHERE $idname = '" . mysql_escape_string($oid)
00162 . "' AND version = 'DEV' AND resourceId = $id";
00163 $results = $this->DBI->query($query);
00164 if(count($this->DBI->getError()) > 0) {
00165 $this->setError('DB error(s): ' . implode('; ', $this->DBI->getError()));
00166 return false;
00167 }
00168
00169 if($results[0]['COUNT(*)'] > 0) {
00170
00171
00172
00173 $query = "UPDATE $this->alignTable SET reason = '" . mysql_escape_string($reason) . "', status = 'CHANGED' WHERE"
00174 . " $idname = '" . mysql_escape_string($oid) . "' AND resourceId = $id AND version = 'DEV' AND status <> 'NEW'";
00175 $description = 'Updating pending alignment';
00176 }
00177 else {
00178
00179 $query = "INSERT INTO $this->alignTable ($idname, resourceId, reason, version, status) VALUES ('"
00180 . mysql_escape_string($oid) . '\', ' . $id . ', \'' . mysql_escape_string($reason) . '\', \'DEV\', \'NEW\')';
00181 $description = 'Creating pending alignment';
00182 }
00183
00184 $this->DBI->query($query);
00185 if(count($this->DBI->getError()) > 0) {
00186 TSD::log("FAILED: $description", $query);
00187 $this->setError('DB error(s): ' . implode('; ', $this->DBI->getError()));
00188 return false;
00189 }
00190 TSD::log($description, $query);
00191 return true;
00192 }
00193
00206 public function unalign($urlOrId) {
00207 if(!TSD::can('align')) {
00208 $this->setError('Permission denied');
00209 return false;
00210 }
00211 if(($id = self::getCWISID($urlOrId)) === false)
00212 return false;
00213 $idname = $this->realID;
00214 $oid = $this->get($this->getUnique());
00215
00216
00217
00218 $query = "UPDATE $this->alignTable SET status = 'DELETED' WHERE $idname = '" . mysql_escape_string($oid)
00219 . "' AND resourceId = $id AND version = 'DEV' AND status <> 'NEW'";
00220 $desc = 'unalign(): marking dev versions as deleted';
00221 $this->DBI->query($query);
00222 if(count($this->DBI->getError()) > 0) {
00223 $this->setError('DB error(s): ' . implode('; ', $this->DBI->getError()));
00224 TSD::log("FAILED: $desc", $query);
00225 return false;
00226 }
00227 TSD::log($desc, $query);
00228
00229
00230
00231 $query = "DELETE FROM $this->alignTable WHERE $idname = '" . mysql_escape_string($oid) . "' AND resourceId = $id "
00232 . " AND version = 'DEV' AND status = 'NEW'";
00233 $this->DBI->query($query);
00234 $desc = 'unalign(): deleting dev versions';
00235 if(count($this->DBI->getError()) > 0) {
00236 $this->setError('DB error(s): ' . implode('; ', $this->DBI->getError()));
00237 TSD::log("FAILED: $desc", $query);
00238 return false;
00239 }
00240 TSD::log($desc, $query);
00241
00242 return true;
00243 }
00244
00266 public function approveAlignments($urlOrId = null) {
00267 if(!TSD::can('approve')) {
00268 $this->setError('Permission denied');
00269 return false;
00270 }
00271 if($urlOrId !== null) {
00272 if(($id = self::getCWISID($urlOrId)) === false)
00273 return false;
00274 }
00275 else
00276 $id = null;
00277
00278 $queryList = array();
00279
00280 $idname = $this->realID;
00281 $oid = $this->get($this->getUnique());
00282
00283 $this->DBI->query('START TRANSACTION');
00284
00285 $query = "SELECT resourceId, reason, status FROM $this->alignTable WHERE $idname = '" . mysql_escape_string($oid)
00286 . "' AND version = 'DEV' AND status <> 'APPROVED'";
00287 if($id !== null)
00288 $query .= ' AND resourceId = ' . $id;
00289 $result = $this->DBI->query($query);
00290 if(count($this->DBI->getError()) > 0) {
00291 $this->DBI->query('ROLLBACK');
00292 $this->setError('DB error(s): ' . implode('; ', $this->DBI->getError()));
00293 return false;
00294 }
00295
00296 foreach($result as $r) {
00297 switch($r['status']) {
00298 case TSD::STATUS_DELETED:
00299
00300 $query = "DELETE FROM $this->alignTable WHERE $idname = '"
00301 . mysql_escape_string($oid) . "' AND resourceId = $r[resourceId]";
00302 break;
00303 case TSD::STATUS_CHANGED:
00304
00305 $query = "UPDATE $this->alignTable SET reason = '" . mysql_escape_string($r['reason'])
00306 . "', status = 'APPROVED' WHERE $idname = '" . mysql_escape_string($oid)
00307 . "' AND resourceId = $r[resourceId]";
00308 break;
00309 case TSD::STATUS_NEW:
00310
00311 $query = "INSERT INTO $this->alignTable ($idname, resourceId, reason, version, status) VALUES "
00312 . "('" . mysql_escape_string($oid) ."', $r[resourceId], '" . mysql_escape_string($r['reason'])
00313 . "', 'LIVE', 'APPROVED')";
00314 break;
00315 }
00316 $this->DBI->query($query);
00317 $queryList[] = $query;
00318 if(count($this->DBI->getError()) > 0) {
00319 $this->DBI->query('ROLLBACK');
00320 TSD::log('FAILED: approveAlignments()', implode("\n", $queryList));
00321 $this->setError('DB error(s): ' . implode('; ', $this->DBI->getError()));
00322 return false;
00323 }
00324 TSD::log('approveAlignments(): copying to live', $query);
00325 if($r['status'] != TSD::STATUS_DELETED) {
00326
00327 $query = "UPDATE $this->alignTable SET status = 'APPROVED' WHERE $idname = '$oid' AND "
00328 . " resourceId = $r[resourceId] AND version = 'DEV'";
00329 $queryList[] = $query;
00330 $this->DBI->query($query);
00331 if(count($this->DBI->getError()) > 0) {
00332 $this->DBI->query('ROLLBACK');
00333 TSD::log('FAILED: approveAlignments()', implode("\n", $queryList));
00334 $this->setError('DB error(s): ' . implode('; ', $this->DBI->getError()));
00335 return false;
00336 }
00337 TSD::log('approveAlignments(): updating dev version', $query);
00338 }
00339 }
00340
00341 $this->DBI->query('COMMIT');
00342
00343 return true;
00344 }
00345
00359 public function cancelAlignments($urlOrId = null) {
00360 if(!TSD::can('approve')) {
00361 $this->setError('Permission denied');
00362 return false;
00363 }
00364 if($urlOrId !== null) {
00365 if(($id = self::getCWISID($urlOrId)) === false)
00366 return false;
00367 }
00368 else
00369 $id = null;
00370
00371 $idname = $this->realID;
00372 $oid = $this->get($this->getUnique());
00373
00374 $queryList = array();
00375
00376 $this->DBI->query('START TRANSACTION');
00377
00378
00379
00380
00381
00382
00383
00384
00385 $query = "DELETE FROM $this->alignTable WHERE $idname = '" . mysql_escape_string($oid) . "' AND version = 'DEV'";
00386 if($id !== null)
00387 $query .= ' AND resourceId = ' . $id;
00388 $desc = 'cancelAlignments(): delete old dev versions';
00389 $queryList[] = $query;
00390 $this->DBI->query($query);
00391 if(count($this->DBI->getError()) > 0) {
00392 $this->DBI->query('ROLLBACK');
00393 TSD::log("FAILED: $desc", implode("\n", $queryList));
00394 $this->setError('DB error(s): ' . implode('; ', $this->DBI->getError()));
00395 return false;
00396 }
00397 TSD::log($desc, $query);
00398
00399
00400 $query = "REPLACE INTO $this->alignTable ($idname, resourceId, reason, version, status) SELECT $idname, resourceId, "
00401 . "reason, 'DEV' AS version, 'APPROVED' AS status FROM $this->alignTable WHERE $idname = '"
00402 . mysql_escape_string($oid) . "'";
00403 if($id !== null)
00404 $query .= ' AND resourceId = ' . $id;
00405 $desc = 'cancelAlignments(): copying live to dev versions';
00406 $queryList[] = $query;
00407 $this->DBI->query($query);
00408 if(count($this->DBI->getError()) > 0) {
00409 $this->DBI->query('ROLLBACK');
00410 TSD::log("FAILED: $desc", implode("\n", $queryList));
00411 $this->setError('DB error(s): ' . implode('; ', $this->DBI->getError()));
00412 return false;
00413 }
00414 TSD::log($desc, $query);
00415
00416 $this->DBI->query('COMMIT');
00417 return true;
00418 }
00419 }
00420
00421 ?>