ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.ilDBUpdate.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3
13{
14
34 public $updateMsg;
35
36
43 public function __construct($a_db_handler = 0, $client_ini = null)
44 {
45 // workaround to allow setup migration
46 $this->client_ini = $client_ini;
47 if ($a_db_handler) {
48 $this->db = &$a_db_handler;
49 $this->PATH = "./";
50 } else {
51 global $DIC;
52 if ($DIC->offsetExists('mySetup')) {
53 $mySetup = $DIC['mySetup'];
54 }
55 $this->db = $mySetup->db;
56 $this->PATH = "./";
57 }
58
59 $this->getCurrentVersion();
60
61 // get update file for current version
62 $updatefile = $this->getFileForStep($this->currentVersion + 1);
63
64 $this->current_file = $updatefile;
65 $this->DB_UPDATE_FILE = $this->PATH . "setup/sql/" . $updatefile;
66
67 //
68 // NOTE: IF YOU SET THIS TO THE NEWEST FILE, CHANGE ALSO getFileForStep()
69 //
70 $this->LAST_UPDATE_FILE = $this->PATH . "setup/sql/dbupdate_04.php";
71
72 $this->readDBUpdateFile();
73 $this->readLastUpdateFile();
74 $this->readFileVersion();
75 }
76
77
85 public function getFileForStep($a_version)
86 {
87 //
88 // NOTE: IF YOU ADD A NEW FILE HERE, CHANGE ALSO THE CONSTRUCTOR
89 //
90 switch (true) {
91 case ((int) $a_version > 4182): // last number in previous file
92 return "dbupdate_04.php";
93 case ((int) $a_version > 2948): // last number in previous file
94 return "dbupdate_03.php";
95 case ((int) $a_version > 864): // last number in previous file
96 return "dbupdate_02.php";
97 default:
98 return "dbupdate.php";
99 }
100 }
101
102
106 public function initStep($i)
107 {
108 //
109 }
110
111
112 public function readDBUpdateFile()
113 {
114 if (!file_exists($this->DB_UPDATE_FILE)) {
115 $this->error = "no_db_update_file";
116 $this->filecontent = array();
117
118 return false;
119 }
120
121 $this->filecontent = @file($this->DB_UPDATE_FILE);
122
123 return true;
124 }
125
126
127 public function readLastUpdateFile()
128 {
129 if (!file_exists($this->LAST_UPDATE_FILE)) {
130 $this->error = "no_last_update_file";
131 $this->lastfilecontent = array();
132
133 return false;
134 }
135
136 $this->lastfilecontent = @file($this->LAST_UPDATE_FILE);
137
138 return true;
139 }
140
141
145 public function getCurrentVersion()
146 {
147 include_once './Services/Administration/classes/class.ilSetting.php';
148 $set = new ilSetting("common", true);
149 $this->currentVersion = (integer) $set->get("db_version");
150
152 }
153
154
160 public function setCurrentVersion($a_version)
161 {
162 include_once './Services/Administration/classes/class.ilSetting.php';
163 $set = new ilSetting("common", true);
164 $set->set("db_version", $a_version);
165 $this->currentVersion = $a_version;
166
167 return true;
168 }
169
170
176 public function setRunningStatus($a_nr)
177 {
178 include_once './Services/Administration/classes/class.ilSetting.php';
179 $set = new ilSetting("common", true);
180 $set->set("db_update_running", $a_nr);
181 $this->db_update_running = $a_nr;
182 }
183
184
190 public function getRunningStatus()
191 {
192 include_once './Services/Administration/classes/class.ilSetting.php';
193 $set = new ilSetting("common", true);
194 $this->db_update_running = (integer) $set->get("db_update_running");
195
196 return $this->db_update_running;
197 }
198
199
203 public function clearRunningStatus()
204 {
205 include_once './Services/Administration/classes/class.ilSetting.php';
206 $set = new ilSetting("common", true);
207 $set->set("db_update_running", 0);
208 $this->db_update_running = 0;
209 }
210
211
212 public function readFileVersion()
213 {
214 //go through filecontent and search for last occurence of <#x>
215 reset($this->lastfilecontent);
216 $regs = array();
217 foreach ($this->lastfilecontent as $row) {
218 if (preg_match('/^<\#([0-9]+)>/', $row, $regs)) {
219 $version = $regs[1];
220 }
221 }
222
223 $this->fileVersion = (integer) $version;
224
225 return $this->fileVersion;
226 }
227
228
232 public function getFileVersion()
233 {
234 return $this->fileVersion;
235 }
236
237
246 public function execQuery($db, $str)
247 {
248 $sql = explode("\n", trim($str));
249 for ($i = 0; $i < count($sql); $i++) {
250 $sql[$i] = trim($sql[$i]);
251 if ($sql[$i] != "" && substr($sql[$i], 0, 1) != "#") {
252 //take line per line, until last char is ";"
253 if (substr($sql[$i], -1) == ";") {
254 //query is complete
255 $q .= " " . substr($sql[$i], 0, -1);
256 $check = $this->checkQuery($q);
257 if ($check === true) {
258 try {
259 $r = $db->query($q);
260 } catch (ilDatabaseException $e) {
261 var_dump($e); // FSX
262 exit;
263 $this->error = $e->getMessage();
264
265 return false;
266 }
267 } else {
268 $this->error = $check;
269
270 return false;
271 }
272 unset($q);
273 } //if
274 else {
275 $q .= " " . $sql[$i];
276 } //else
277 } //if
278 } //for
279 if ($q != "") {
280 echo "incomplete_statement: " . $q . "<br>";
281
282 return false;
283 }
284
285 return true;
286 }
287
288
292 public function checkQuery($q)
293 {
294 return true;
295 }
296
297
303 private function initGlobalsRequiredForUpdateSteps(&$ilCtrlStructureReader, &$ilMySQLAbstraction, &$ilDB)
304 {
305 global $DIC;
306
307 // TODO: There is currently a huge mixup of globals, $DIC and dependencies, esprecially in setup and during DB-Updates. This leads to many problems. The following core tries to provide the needed dependencies for the dbupdate-script. The code hopefully will change in the future.
308
309 if (isset($GLOBALS['ilCtrlStructureReader'])) {
310 $ilCtrlStructureReader = $GLOBALS['ilCtrlStructureReader'];
311 } elseif ($DIC->offsetExists('ilCtrlStructureReader')) {
312 $ilCtrlStructureReader = $DIC['ilCtrlStructureReader'];
313 } else {
314 require_once 'setup/classes/class.ilCtrlStructureReader.php';
316 $DIC->offsetSet('ilCtrlStructureReader', $ilCtrlStructureReader);
317 }
318
319 $GLOBALS['ilCtrlStructureReader'] = $ilCtrlStructureReader;
320
321 if ($DIC->offsetExists('ilMySQLAbstraction')) {
322 $ilMySQLAbstraction = $DIC['ilMySQLAbstraction'];
323 } else {
324 $ilMySQLAbstraction = new ilMySQLAbstraction();
325 $DIC->offsetSet('ilMySQLAbstraction', $ilMySQLAbstraction);
326 }
327
328 $GLOBALS['ilMySQLAbstraction'] = $ilMySQLAbstraction;
329
330 if ($this->client_ini) {
331 $ilCtrlStructureReader->setIniFile($this->client_ini);
332 }
333 $ilDB = $DIC->database();
334 }
335
336
340 public function applyUpdate($a_break = 0)
341 {
343 $ilMySQLAbstraction = null;
344 $ilDB = null;
346
349
350 if ($a_break > $this->currentVersion
351 && $a_break < $this->fileVersion
352 ) {
353 $f = $a_break;
354 }
355
356 if ($c < $f) {
357 $msg = array();
358 for ($i = ($c + 1); $i <= $f; $i++) {
359 // check wether next update file must be loaded
360 if ($this->current_file != $this->getFileForStep($i)) {
361 $this->DB_UPDATE_FILE = $this->PATH . "setup/sql/" . $this->getFileForStep($i);
362 $this->readDBUpdateFile();
363 }
364
365 $this->initStep($i);
366
367 if ($this->applyUpdateNr($i, $inifile) == false) {
368 $msg[] = array("msg" => "update_error: " . $this->error,
369 "nr" => $i,);
370 $this->updateMsg = $msg;
371
372 return false;
373 } else {
374 $msg[] = array("msg" => "update_applied",
375 "nr" => $i,);
376 }
377 }
378
379 $this->updateMsg = $msg;
380 } else {
381 $this->updateMsg = "no_changes";
382 }
383
384 if ($f < $this->fileVersion) {
385 return true;
386 } else {
387 return $this->loadXMLInfo();
388 }
389 }
390
391
392 public function loadXMLInfo()
393 {
395 $ilMySQLAbstraction = null;
396 $ilDB = null;
398
399 // read module and service information into db
400 require_once "./setup/classes/class.ilModuleReader.php";
401 require_once "./setup/classes/class.ilServiceReader.php";
402 require_once "./setup/classes/class.ilCtrlStructureReader.php";
403
404 require_once "./Services/Component/classes/class.ilModule.php";
405 require_once "./Services/Component/classes/class.ilService.php";
408
409 $ilCtrlStructureReader->readStructure();
410
411 $mr = new ilModuleReader("", "", "");
412 $mr->clearTables();
413 foreach ($modules as $module) {
414 $mr = new ilModuleReader(
415 ILIAS_ABSOLUTE_PATH . "/Modules/" . $module["subdir"] . "/module.xml",
416 $module["subdir"],
417 "Modules"
418 );
419 $mr->getModules();
420 unset($mr);
421 }
422
423 $sr = new ilServiceReader("", "", "");
424 $sr->clearTables();
425 foreach ($services as $service) {
426 $sr = new ilServiceReader(
427 ILIAS_ABSOLUTE_PATH . "/Services/" . $service["subdir"] . "/service.xml",
428 $service["subdir"],
429 "Services"
430 );
431 $sr->getServices();
432 unset($sr);
433 }
434
435
436
437 return true;
438 }
439
440
449 public function applyUpdateNr($nr, $hotfix = false, $custom_update = false)
450 {
452 $ilMySQLAbstraction = null;
453 $ilDB = null;
455
456 //search for desired $nr
457 reset($this->filecontent);
458
459 if (!$hotfix && !$custom_update) {
460 $this->setRunningStatus($nr);
461 }
462
463 //init
464 $i = 0;
465
466 //go through filecontent
467 while (!preg_match("/^<\#" . $nr . ">/", $this->filecontent[$i]) && $i < count($this->filecontent)) {
468 $i++;
469 }
470
471 //update not found
472 if ($i == count($this->filecontent)) {
473 $this->error = "update_not_found";
474
475 return false;
476 }
477
478 $i++;
479
480 //update found, now extract this update to a new array
481 $update = array();
482 while ($i < count($this->filecontent) && !preg_match("/^<#" . ($nr + 1) . ">/", $this->filecontent[$i])) {
483 $update[] = trim($this->filecontent[$i]);
484 $i++;
485 }
486
487 //now you have the update, now process it
488 $sql = array();
489 $php = array();
490 $mode = "sql";
491
492 foreach ($update as $row) {
493 if (preg_match("/<\?php/", $row)) {
494 if (count($sql) > 0) {
495 if ($this->execQuery($this->db, implode("\n", $sql)) == false) {
496 $this->error = $this->error;
497
498 return false;
499 }
500 $sql = array();
501 }
502 $mode = "php";
503 } elseif (preg_match("/\?>/", $row)) {
504 if (count($php) > 0) {
505 $code = implode("\n", $php);
506 if (eval($code) === false) {
507 $this->error = "Parse error: " . $code;
508
509 return false;
510 }
511 $php = array();
512 }
513 $mode = "sql";
514 } else {
515 if ($mode == "sql") {
516 $sql[] = $row;
517 }
518
519 if ($mode == "php") {
520 $php[] = $row;
521 }
522 } //else
523 } //foreach
524
525 if ($mode == "sql" && count($sql) > 0) {
526 if ($this->execQuery($this->db, implode("\n", $sql)) == false) {
527 $this->error = "dump_error: " . $this->error;
528
529 return false;
530 }
531 }
532
533 //increase db_Version number
534 if (!$hotfix && !$custom_update) {
535 $this->setCurrentVersion($nr);
536 } elseif ($hotfix) {
537 $this->setHotfixCurrentVersion($nr);
538 } elseif ($custom_update) {
540 }
541
542 if (!$hotfix && !$custom_update) {
543 $this->clearRunningStatus();
544 }
545
546 //$this->currentVersion = $ilias->getSetting("db_version");
547
548 return true;
549 }
550
551
552 public function getDBVersionStatus()
553 {
554 if ($this->fileVersion > $this->currentVersion) {
555 return false;
556 } else {
557 return true;
558 }
559 }
560
561
562 public function getTables()
563 {
564 $a = array();
565
566 $query = "SHOW TABLES";
567 $res = $this->db->query($query);
568 while ($row = $res->fetchRow()) {
569 $status = $this->getTableStatus($row[0]);
570 $a[] = array("name" => $status["Table"],
571 "table" => $row[0],
572 "status" => $status["Msg_text"],);
573 }
574
575 return $a;
576 }
577
578
579 public function getTableStatus($table)
580 {
581 $a = array();
582
583 $query = "ANALYZE TABLE " . $table;
584 $res = $this->db->query($query);
586
587 return $row;
588 }
589
590
594
598 public function getHotfixCurrentVersion()
599 {
600 $this->readHotfixInfo();
601
602 return $this->hotfix_current_version;
603 }
604
605
609 public function setHotfixCurrentVersion($a_version)
610 {
611 $this->readHotfixInfo();
612 $this->hotfix_setting->set(
613 "db_hotfixes_" . $this->hotfix_version[0] . "_" . $this->hotfix_version[1],
614 $a_version
615 );
616 $this->hotfix_current_version = $a_version;
617
618 return true;
619 }
620
621
625 public function getHotfixFileVersion()
626 {
627 $this->readHotfixInfo();
628
629 return $this->hotfix_file_version;
630 }
631
632
636 public function readHotfixFileVersion($a_file_content)
637 {
638 //go through filecontent and search for last occurence of <#x>
639 reset($a_file_content);
640 $regs = array();
641 foreach ($a_file_content as $row) {
642 if (preg_match("/^<#([0-9]+)>/", $row, $regs)) {
643 $version = $regs[1];
644 }
645 }
646
647 return (integer) $version;
648 }
649
650
654 public function readHotfixInfo($a_force = false)
655 {
656 if ($this->hotfix_info_read && !$a_force) {
657 return;
658 }
659 include_once './Services/Administration/classes/class.ilSetting.php';
660 $this->hotfix_setting = new ilSetting("common", true);
661 $ilias_version = ILIAS_VERSION_NUMERIC;
662 $version_array = explode(".", $ilias_version);
663 $this->hotfix_version[0] = $version_array[0];
664 $this->hotfix_version[1] = $version_array[1];
665 $hotfix_file = $this->PATH . "setup/sql/" . $this->hotfix_version[0] . "_" . $this->hotfix_version[1] . "_hotfixes.php";
666 if (is_file($hotfix_file)) {
667 $this->hotfix_content = @file($hotfix_file);
668 $this->hotfix_current_version = (int) $this->hotfix_setting->get(
669 "db_hotfixes_" . $this->hotfix_version[0] . "_" . $this->hotfix_version[1]
670 );
671 $this->hotfix_file_version = $this->readHotfixFileVersion($this->hotfix_content);
672 }
673 $this->hotfix_info_read = true;
674 }
675
676
680 public function hotfixAvailable()
681 {
682 $this->readHotfixInfo();
683 if ($this->hotfix_file_version > $this->hotfix_current_version) {
684 return true;
685 }
686
687 return false;
688 }
689
690
694 public function applyHotfix()
695 {
697 $ilMySQLAbstraction = null;
698 $ilDB = null;
700
701 include_once './Services/Database/classes/class.ilMySQLAbstraction.php';
702
703 $ilMySQLAbstraction = new ilMySQLAbstraction();
704 $GLOBALS['DIC']['ilMySQLAbstraction'] = $ilMySQLAbstraction;
705
706 $this->readHotfixInfo(true);
707
708 $f = $this->getHotfixFileVersion();
709 $c = $this->getHotfixCurrentVersion();
710
711 if ($c < $f) {
712 $msg = array();
713 for ($i = ($c + 1); $i <= $f; $i++) {
714 // $this->initStep($i); // nothings happens here
715
716 $this->filecontent = $this->hotfix_content;
717
718 if ($this->applyUpdateNr($i, true) == false) {
719 $msg[] = array("msg" => "update_error: " . $this->error,
720 "nr" => $i,);
721 $this->updateMsg = $msg;
722
723 return false;
724 } else {
725 $msg[] = array("msg" => "hotfix_applied",
726 "nr" => $i,);
727 }
728 }
729
730 $this->updateMsg = $msg;
731 } else {
732 $this->updateMsg = "no_changes";
733 }
734
735 return $this->loadXMLInfo();
736 }
737
738
740 {
741 $this->readCustomUpdatesInfo();
742
743 return $this->custom_updates_current_version;
744 }
745
746
747 public function setCustomUpdatesCurrentVersion($a_version)
748 {
749 $this->readCustomUpdatesInfo();
750 $this->custom_updates_setting->set('db_version_custom', $a_version);
751 $this->custom_updates_current_version = $a_version;
752
753 return true;
754 }
755
756
758 {
759 $this->readCustomUpdatesInfo();
760
761 return $this->custom_updates_file_version;
762 }
763
764
765 public function readCustomUpdatesFileVersion($a_file_content)
766 {
767 //go through filecontent and search for last occurence of <#x>
768 reset($a_file_content);
769 $regs = array();
770 foreach ($a_file_content as $row) {
771 if (preg_match("/^<#([0-9]+)>/", $row, $regs)) {
772 $version = $regs[1];
773 }
774 }
775
776 return (integer) $version;
777 }
778
779
780 public function readCustomUpdatesInfo($a_force = false)
781 {
782 if ($this->custom_updates_info_read && !$a_force) {
783 return;
784 }
785 include_once './Services/Administration/classes/class.ilSetting.php';
786
787 $this->custom_updates_setting = new ilSetting();
788 $custom_updates_file = $this->PATH . "setup/sql/dbupdate_custom.php";
789 if (is_file($custom_updates_file)) {
790 $this->custom_updates_content = @file($custom_updates_file);
791 $this->custom_updates_current_version = (int) $this->custom_updates_setting->get('db_version_custom', 0);
792 $this->custom_updates_file_version = $this->readCustomUpdatesFileVersion($this->custom_updates_content);
793 }
794 $this->custom_updates_info_read = true;
795 }
796
797
798 public function customUpdatesAvailable()
799 {
800 // trunk does not support custom updates
801 // return false;
802
803 $this->readCustomUpdatesInfo();
804 if ($this->custom_updates_file_version > $this->custom_updates_current_version) {
805 return true;
806 }
807
808 return false;
809 }
810
811
812 public function applyCustomUpdates()
813 {
815 $ilMySQLAbstraction = null;
816 $ilDB = null;
818
819 include_once './Services/Database/classes/class.ilMySQLAbstraction.php';
820
821 $ilMySQLAbstraction = new ilMySQLAbstraction();
822 $GLOBALS['DIC']['ilMySQLAbstraction'] = $ilMySQLAbstraction;
823
824 $this->readCustomUpdatesInfo(true);
825
828
829 if ($c < $f) {
830 $msg = array();
831 for ($i = ($c + 1); $i <= $f; $i++) {
832 $this->filecontent = $this->custom_updates_content;
833
834 if ($this->applyUpdateNr($i, false, true) == false) {
835 $msg[] = array("msg" => "update_error: " . $this->error,
836 "nr" => $i,);
837 $this->updateMsg = $msg;
838
839 return false;
840 } else {
841 $msg[] = array("msg" => "custom_update_applied",
842 "nr" => $i,);
843 }
844 }
845
846 $this->updateMsg = $msg;
847 } else {
848 $this->updateMsg = "no_changes";
849 }
850
851 return $this->loadXMLInfo();
852 }
853
854
860 public function getUpdateSteps($a_break = 0)
861 {
863 $ilMySQLAbstraction = null;
864 $ilDB = null;
866
867 $str = "";
868
871
872 if ($a_break > $this->currentVersion
873 && $a_break < $this->fileVersion
874 ) {
875 $f = $a_break;
876 }
877
878 if ($c < $f) {
879 $msg = array();
880 for ($i = ($c + 1); $i <= $f; $i++) {
881 // check wether next update file must be loaded
882 if ($this->current_file != $this->getFileForStep($i)) {
883 $this->DB_UPDATE_FILE = $this->PATH . "setup/sql/" . $this->getFileForStep($i);
884 $this->readDBUpdateFile();
885 }
886
887 $str .= $this->getUpdateStepNr($i);
888 }
889 }
890
891 return $str;
892 }
893
894
900 public function getHotfixSteps()
901 {
902 $this->readHotfixInfo(true);
903
904 $str = "";
905
906 $f = $this->getHotfixFileVersion();
907 $c = $this->getHotfixCurrentVersion();
908
909 if ($c < $f) {
910 $msg = array();
911 for ($i = ($c + 1); $i <= $f; $i++) {
912 $this->filecontent = $this->hotfix_content;
913
914 $str .= $this->getUpdateStepNr($i, true);
915 }
916 }
917
918 return $str;
919 }
920
921
925 public function getUpdateStepNr($nr, $hotfix = false, $custom_update = false)
926 {
927 $str = "";
928
929 //search for desired $nr
930 reset($this->filecontent);
931
932 //init
933 $i = 0;
934
935 //go through filecontent
936 while (!preg_match("/^<#" . $nr . ">/", $this->filecontent[$i]) && $i < count($this->filecontent)) {
937 $i++;
938 }
939
940 //update not found
941 if ($i == count($this->filecontent)) {
942 return false;
943 }
944
945 $i++;
946
947 //update found, now extract this update to a new array
948 $update = array();
949 while ($i < count($this->filecontent) && !preg_match("/^<#" . ($nr + 1) . ">/", $this->filecontent[$i])) {
950 $str .= $this->filecontent[$i];
951 $i++;
952 }
953
954 return "<pre><b><#" . $nr . "></b>\n" . htmlentities($str) . "</pre>";
955 }
956}
exit
Definition: backend.php:16
$version
Definition: build.php:27
An exception for terminatinating execution or to throw for unit testing.
error($a_errmsg)
set error message @access public
Class ilCtrlStructureReader.
Database Update class.
getUpdateStepNr($nr, $hotfix=false, $custom_update=false)
Get single update step for presentation.
getFileVersion()
Get Version of file.
applyUpdate($a_break=0)
Apply update.
readCustomUpdatesInfo($a_force=false)
__construct($a_db_handler=0, $client_ini=null)
ilDBUpdate constructor.
$DB_UPDATE_FILE
db update file
getHotfixSteps()
Get hotfix steps.
setCurrentVersion($a_version)
getFileForStep($a_version)
Get db update file name for db step.
getUpdateSteps($a_break=0)
Get update steps as string (for presentation)
setRunningStatus($a_nr)
Set running status for a step.
getCustomUpdatesCurrentVersion()
setHotfixCurrentVersion($a_version)
Set current hotfix version.
initGlobalsRequiredForUpdateSteps(&$ilCtrlStructureReader, &$ilMySQLAbstraction, &$ilDB)
execQuery($db, $str)
execute a query
checkQuery($q)
check query
getHotfixCurrentVersion()
Get current hotfix version.
getHotfixFileVersion()
Get current hotfix version.
readHotfixInfo($a_force=false)
Get status of hotfix file.
readCustomUpdatesFileVersion($a_file_content)
hotfixAvailable()
Get status of hotfix file.
setCustomUpdatesCurrentVersion($a_version)
getTableStatus($table)
applyUpdateNr($nr, $hotfix=false, $custom_update=false)
apply an update
clearRunningStatus()
Clear running status.
applyHotfix()
Apply hotfix.
getRunningStatus()
Get running status.
readHotfixFileVersion($a_file_content)
Set current hotfix version.
Class ilDatabaseException.
Class ilModuleReader.
static getAvailableCoreModules()
Get all available core modules.
This class includes methods that help to abstract ILIAS 3.10.x MySQL tables for the use with MDB2 abs...
Class ilServiceReader.
static getAvailableCoreServices()
Get all available core services.
ILIAS Setting Class.
$i
Definition: disco.tpl.php:19
$r
Definition: example_031.php:79
$code
Definition: example_050.php:99
const ILIAS_VERSION_NUMERIC
$ilCtrlStructureReader
$row
if($modEnd===false) $module
Definition: module.php:59
$GLOBALS['JPEG_Segment_Names']
Global Variable: XMP_tag_captions.
const PATH
Definition: proxy_ylocal.php:8
$query
if(empty($password)) $table
Definition: pwgen.php:24
global $DIC
Definition: saml.php:7
foreach($_POST as $key=> $value) $res
global $ilDB