Skip to content

Commit f367977

Browse files
committed
bereinigt die Tabellen von DBTransaction
close #167
1 parent bae1dbd commit f367977

File tree

8 files changed

+329
-4
lines changed

8 files changed

+329
-4
lines changed

DB/DBTransaction/Commands.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
{ "method":"get", "path":"(/:name)/link/exists/course/:courseid" },
88
{ "method":"get", "path":"(/:name)/transaction/authentication/:auid/transaction/:tid" },
99
{ "method":"get", "path":"(/:name)/transaction/transaction/:tid" },
10+
{ "method":"get", "path":"(/:name)/clean/clean/course/:courseid" },
11+
{ "method":"delete", "path":"(/:name)/clean/clean/course/:courseid" },
1012
{ "method":"delete", "path":"(/:name)/course" },
1113
{ "method":"post", "path":"(/:name)/course/:courseid" }
1214
]

DB/DBTransaction/Component.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
"connector":[
1717
{"name":"request", "target":"CLocalObjectRequest"},
1818
{"name":"postCourse", "target":"LCourse", "priority":150},
19-
{"name":"deleteCourse", "target":"LCourse", "priority":150}
19+
{"name":"deleteCourse", "target":"LCourse", "priority":150},
20+
{"name":"getCleanAmount", "target":"CInstall"},
21+
{"name":"deleteClean", "target":"CInstall"}
2022
]
2123
}

DB/DBTransaction/DBTransaction.php

Lines changed: 97 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public function __construct( )
6363
'Content-Type',
6464
'application/json'
6565
);
66+
6667
// POST AddCourse
6768
$this->_app->post(
6869
'(/:name)/course',
@@ -151,8 +152,26 @@ public function __construct( )
151152
$this,
152153
'getTransactionShort'
153154
)
154-
);
155+
);
156+
157+
// GET GetAmountOfExpiredTransactions
158+
$this->_app->get(
159+
'(/:name)/clean/clean/course/:courseid',
160+
array(
161+
$this,
162+
'getAmountOfExpiredTransactions'
163+
)
164+
);
155165

166+
// DELETE CleanTransactions
167+
$this->_app->delete(
168+
'(/:name)/clean/clean/course/:courseid',
169+
array(
170+
$this,
171+
'cleanTransactions'
172+
)
173+
);
174+
156175
// run Slim
157176
$this->_app->run( );
158177
}
@@ -526,6 +545,83 @@ public function deleteCourse( $name='' , $courseid )
526545
}
527546
}
528547

548+
public function cleanTransactions( $name='' , $courseid )
549+
{
550+
$this->loadConfig($name);
551+
$name = ($name === '' ? '' : '_') . $name;
552+
553+
Logger::Log(
554+
'starts DELETE CleanTransactions',
555+
LogLevel::DEBUG
556+
);
557+
$courseid = DBJson::mysql_real_escape_string( $courseid );
558+
559+
// starts a query, by using a given file
560+
$result = DBRequest::getRoutedSqlFile(
561+
$this->query,
562+
dirname(__FILE__) . '/Sql/CleanTransactions.sql',
563+
array( 'courseid' => $courseid,'name' => $name )
564+
);
565+
566+
// checks the correctness of the query
567+
if ( $result['status'] >= 200 &&
568+
$result['status'] <= 299 ){
569+
570+
$this->_app->response->setStatus( 201 );
571+
$this->_app->response->setBody( '' );
572+
573+
} else {
574+
Logger::Log(
575+
'DELETE CleanTransactions failed',
576+
LogLevel::ERROR
577+
);
578+
$this->_app->response->setStatus( isset( $result['status'] ) ? $result['status'] : 409 );
579+
$this->_app->response->setBody( '' );
580+
$this->_app->stop( );
581+
}
582+
}
583+
584+
public function getAmountOfExpiredTransactions( $name='' , $courseid )
585+
{
586+
$this->loadConfig($name);
587+
$name = ($name === '' ? '' : '_') . $name;
588+
589+
Logger::Log(
590+
'starts GET GetAmountOfExpiredTransactions',
591+
LogLevel::DEBUG
592+
);
593+
$courseid = DBJson::mysql_real_escape_string( $courseid );
594+
595+
// starts a query, by using a given file
596+
$result = DBRequest::getRoutedSqlFile(
597+
$this->query,
598+
dirname(__FILE__) . '/Sql/procedures/GetAmountOfExpiredTransactions.sql',
599+
array( 'courseid' => $courseid,'name' => $name )
600+
);
601+
602+
// checks the correctness of the query
603+
if ( $result['status'] >= 200 &&
604+
$result['status'] <= 299 ){
605+
606+
$query = Query::decodeQuery($result['content']);
607+
$result = $query->getResponse();
608+
foreach ($result as &$res){
609+
$res['component'] = $this->_conf->getName();
610+
}
611+
$this->_app->response->setStatus( 200 );
612+
$this->_app->response->setBody( json_encode($result) );
613+
614+
} else {
615+
Logger::Log(
616+
'GET GetAmountOfExpiredTransactions failed',
617+
LogLevel::ERROR
618+
);
619+
$this->_app->response->setStatus( isset( $result['status'] ) ? $result['status'] : 409 );
620+
$this->_app->response->setBody( '' );
621+
$this->_app->stop( );
622+
}
623+
}
624+
529625
/**
530626
* Adds the component to a course
531627
*
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
/**
3+
* @file CleanTransactions.sql
4+
* removes expired transactions from %Transaction table
5+
* @author Till Uhlig
6+
* @result -
7+
*/
8+
?>
9+
10+
delete from `Transaction<?php echo $name; ?>_<?php echo $courseid; ?>`
11+
where T_durability < UNIX_TIMESTAMP();
12+
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
/**
3+
* @file GetAmountOfExpiredTransactions.sql
4+
* counts expired transactions from %Transaction table
5+
* @author Till Uhlig
6+
* @result
7+
* - int
8+
*/
9+
?>
10+
11+
select count(*) as 'amount', 'Transaction<?php echo $name; ?>_<?php echo $courseid; ?>' as 'table' from `Transaction<?php echo $name; ?>_<?php echo $courseid; ?>`
12+
where T_durability < UNIX_TIMESTAMP();

install/component/CInstall.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
"baseURI":"/cinstall",
77
"option":"confPath=install/component/cinstall_cconfig.json",
88
"links":[
9-
{"name":"postPlatform","target":"","links":[]}
9+
{"name":"postPlatform","target":"","links":[]},
10+
{"name":"getCleanAmount","target":"","links":[]},
11+
{"name":"deleteClean","target":"","links":[]}
1012
]
1113
}

install/languages/de.ini

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,4 +193,13 @@ createTables = "initialisieren"
193193
details = "Details anzeigen"
194194
operationFailed = "konnte nicht aufgerufen werden oder es gibt keine Veranstaltungen."
195195
differentAnswers = "Anfrageergebnisse stimmen nicht überein"
196-
description = "Dieser Vorgang sendet, an alle existierenden Veranstaltungen, einen <span class='info-color'>POST /course</span> Aufruf über LCourse, um u.a. die Datenbanktabellen zu initialisieren/aktualisieren."
196+
description = "Dieser Vorgang sendet, an alle existierenden Veranstaltungen, einen <span class='info-color'>POST /course</span> Aufruf über LCourse, um u.a. die Datenbanktabellen zu initialisieren/aktualisieren."
197+
198+
199+
[cleanCourses]
200+
title = "Veranstaltungen bereinigen"
201+
getAmount = "Bedarf ermitteln"
202+
collectAmount = "Ermitteln"
203+
description = "Hier werden überfüssige Datenbankeinträge ermittelt und bereinigt."
204+
cleanCourses = "Plattform bereinigen"
205+
clean = "Bereinigen"
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
<?php
2+
#region VeranstaltungenBereinigen
3+
class VeranstaltungenBereinigen
4+
{
5+
private static $initialized=false;
6+
public static $name = 'cleanCourses';
7+
public static $installed = false;
8+
public static $page = 4;
9+
public static $rank = 250;
10+
public static $enabledShow = true;
11+
12+
public static $onEvents = array('collectCleanCourses'=>array('procedure'=>'collectCleanCourses','name'=>'collectCleanCourses','event'=>array('actionCollectCleanCourses')),'cleanCourses'=>array('procedure'=>'cleanCourses','name'=>'cleanCourses','event'=>array('actionCleanCourses')));
13+
14+
public static function getDefaults()
15+
{
16+
}
17+
18+
public static function init($console, &$data, &$fail, &$errno, &$error)
19+
{
20+
self::$initialized = true;
21+
}
22+
23+
public static function show($console, $result, $data)
24+
{
25+
$executedEvents = array();
26+
foreach($result as $key => $value){
27+
$executedEvents[] = $key;
28+
}
29+
30+
$text='';
31+
$text .= Design::erstelleBeschreibung($console,Language::Get('cleanCourses','description'));
32+
33+
if (!$console){
34+
$text .= Design::erstelleZeile($console, Language::Get('cleanCourses','getAmount'), 'e', '', 'v', Design::erstelleSubmitButton(self::$onEvents['collectCleanCourses']['event'][0],Language::Get('cleanCourses','collectAmount')), 'h');
35+
}
36+
37+
if (isset($result[self::$onEvents['collectCleanCourses']['name']]) && $result[self::$onEvents['collectCleanCourses']['name']]!=null){
38+
$result = $result[self::$onEvents['collectCleanCourses']['name']];
39+
} else
40+
$result = array('content'=>null,'fail'=>false,'errno'=>null,'error'=>null);
41+
42+
$fail = $result['fail'];
43+
$error = $result['error'];
44+
$errno = $result['errno'];
45+
$content = $result['content'];
46+
47+
if (self::$installed){
48+
if (!$console && isset($data['C']['c_details']) && $data['C']['c_details'] === 'details'){
49+
if (isset($content)){
50+
foreach ($content as $component => $dat){
51+
$text .= "<tr><td class='e' rowspan='1'>{$component}</td><td class='v'><div align ='center'>{$dat['amount']}</align></td></tr>";
52+
}
53+
}
54+
} else {
55+
$count=0;
56+
if (isset($content)){
57+
foreach ($content as $component => $dat){
58+
$count+=$dat['amount'];
59+
}
60+
}
61+
62+
$text .= Design::erstelleZeile($console, Language::Get('cleanCourses','dirtyRows'), 'e', $count , 'v_c');
63+
}
64+
65+
if (!$console && in_array(self::$onEvents['collectCleanCourses']['name'],$executedEvents)){
66+
$text .= Design::erstelleZeile($console, Language::Get('cleanCourses','cleanCourses'), 'e', '', 'v', Design::erstelleSubmitButton(self::$onEvents['cleanCourses']['event'][0],Language::Get('cleanCourses','clean')), 'h');
67+
} elseif (!$console && in_array(self::$onEvents['cleanCourses']['name'],$executedEvents)){
68+
$text .= Design::erstelleInstallationszeile($console, $fail, $errno, $error);
69+
}
70+
}
71+
72+
echo Design::erstelleBlock($console, Language::Get('cleanCourses','title'), $text);
73+
return null;
74+
}
75+
76+
public static function collectCleanCourses($data, &$fail, &$errno, &$error)
77+
{
78+
$res = array();
79+
80+
if (!$fail){
81+
$cleanLinks = Einstellungen::getLinks('getCleanAmount');
82+
83+
// alle Veranstaltungen abrufen
84+
$multiRequestHandle = new Request_MultiRequest();
85+
$handler = Request_CreateRequest::createGet($data['PL']['url'].'/DB/DBCourse/course',array(),'');
86+
$multiRequestHandle->addRequest($handler);
87+
$result = $multiRequestHandle->run();
88+
if (isset($result[0]['content']) && isset($result[0]['status']) && $result[0]['status'] === 200){
89+
// /course ausloesen
90+
$courses = Course::decodeCourse($result[0]['content']);
91+
if (!is_array($courses)) $courses = array($courses);
92+
93+
$offset = count($courses)-50; // nur die letzten 50 Veranstaltungen werden bereinigt
94+
$offset = ($offset<0?0:$offset);
95+
$courses = array_slice($courses,$offset);
96+
97+
foreach($courses as $course){
98+
99+
$multiRequestHandle = new Request_MultiRequest();
100+
for ($i=0;$i<count($cleanLinks);$i++){
101+
// inits all components
102+
$handler = Request_CreateRequest::createGet($cleanLinks[$i]->getAddress(). '/clean/clean/course/'.$course->getId(),array(), '');
103+
$multiRequestHandle->addRequest($handler);
104+
}
105+
$answer = $multiRequestHandle->run();
106+
107+
//$res[$course->getId()] = array();
108+
foreach ($answer as $result){
109+
if (isset($result['content']) && isset($result['status']) && $result['status'] === 200){
110+
$tables = json_decode($result['content'],true);
111+
foreach ($tables as $table){
112+
if (!isset($res[$table['component']])){
113+
$res[$table['component']] = array('amount'=>0,'dirtyTables'=>0,'cleanTables'=>0);
114+
}
115+
116+
if (isset($table['amount'])){
117+
if ($table['amount'] == 0){
118+
$res[$table['component']]['cleanTables']++;
119+
} else {
120+
$res[$table['component']]['amount']+=$table['amount'];
121+
$res[$table['component']]['dirtyTables']++;
122+
}
123+
} else {
124+
$res[$table['component']]['cleanTables']++;
125+
}
126+
127+
}
128+
}
129+
}
130+
}
131+
132+
} else {
133+
$fail = true;
134+
$error = "GET /DB/DBCourse/course ".Language::Get('courses','operationFailed');
135+
if (isset($result[0]['status'])){
136+
$errno = $result[0]['status'];
137+
}
138+
}
139+
}
140+
141+
return $res;
142+
}
143+
144+
public static function cleanCourses($data, &$fail, &$errno, &$error)
145+
{
146+
$res = array();
147+
148+
if (!$fail){
149+
$cleanLinks = Einstellungen::getLinks('deleteClean');
150+
151+
// alle Veranstaltungen abrufen
152+
$multiRequestHandle = new Request_MultiRequest();
153+
$handler = Request_CreateRequest::createGet($data['PL']['url'].'/DB/DBCourse/course',array(),'');
154+
$multiRequestHandle->addRequest($handler);
155+
$result = $multiRequestHandle->run();
156+
if (isset($result[0]['content']) && isset($result[0]['status']) && $result[0]['status'] === 200){
157+
// /course ausloesen
158+
$courses = Course::decodeCourse($result[0]['content']);
159+
if (!is_array($courses)) $courses = array($courses);
160+
161+
$offset = count($courses)-50; // nur die letzten 50 Veranstaltungen werden bereinigt
162+
$offset = ($offset<0?0:$offset);
163+
$courses = array_slice($courses,$offset);
164+
165+
foreach($courses as $course){
166+
167+
$multiRequestHandle = new Request_MultiRequest();
168+
$answer=array();
169+
for ($i=0;$i<count($cleanLinks);$i++){
170+
// inits all components
171+
$handler = Request_CreateRequest::createDelete($cleanLinks[$i]->getAddress(). '/clean/clean/course/'.$course->getId(),array(), '');
172+
$multiRequestHandle->addRequest($handler);
173+
}
174+
$answer = $multiRequestHandle->run();
175+
}
176+
$res['status'] = 201;
177+
178+
} else {
179+
$fail = true;
180+
$error = "GET /DB/DBCourse/course ".Language::Get('courses','operationFailed');
181+
if (isset($result[0]['status'])){
182+
$errno = $result[0]['status'];
183+
}
184+
}
185+
}
186+
187+
return $res;
188+
}
189+
}
190+
#endregion VeranstaltungenBereinigen

0 commit comments

Comments
 (0)