8include_once (
"Services/PEAR/lib/MDB2.php");
 
   55                        "text" => array(
"length", 
"notnull", 
"default", 
"fixed"),
 
   56                        "integer" => array(
"length", 
"notnull", 
"default", 
"unsigned"),
 
   57                        "float" => array(
"notnull", 
"default"),
 
   58                        "date" => array(
"notnull", 
"default"),
 
   59                        "time" => array(
"notnull", 
"default"),
 
   60                        "timestamp" => array(
"notnull", 
"default"),
 
   61                        "clob" => array(
"notnull", 
"default"),
 
   62                        "blob" => array(
"notnull", 
"default")
 
   85                $this->db_user = $a_user;
 
  105                $this->db_port = $a_port;
 
  115                return $this->db_port;
 
  125                $this->db_host = $a_host;
 
  145                $this->db_password = $a_password;
 
  155                return $this->db_password;
 
  165                $this->db_name = $a_name;
 
  211                $this->db->setOption(
'result_buffering',$a_status);
 
  220                global $ilClientIniFile;
 
  223                if (is_object($tmpClientIniFile))
 
  224                        $clientIniFile = $tmpClientIniFile;
 
  226                        $clientIniFile = $ilClientIniFile;      
 
  228                if (is_object($clientIniFile ))
 
  241        function connect($a_return_false_for_error = 
false)
 
  248                if ($this->
getDSN() == 
"")
 
  283                        array(
"use_transactions" => 
true));
 
  291                $this->db->disconnect();
 
  334                        array(
"use_transactions" => 
true));
 
  346                        $this->db->setOption(
"portability", $this->db->getOption(
"portability") - $cur);
 
  349                        $this->db->setOption(
"portability", $this->db->getOption(
"portability") - $cur);
 
  396                $this->use_slave = $a_val;
 
  413                                $a_level = $this->error_class->FATAL;
 
  424                                        throw new Exception();
 
  428                                        $stack = $e->getTraceAsString();
 
  434                                        $a_res->getMessage().
"<br />".$a_res->getUserInfo().
"<br />".$stack, $a_level);                                                 
 
  489                        $a_level = $this->error_class->FATAL;
 
  504                        $this->db->loadModule(
'Extended');
 
  529                if ($a_collation != 
"")
 
  531                        $sql = 
"CREATE DATABASE ".$a_name.
 
  532                                " CHARACTER SET ".$a_charset.
 
  533                                " COLLATE ".$a_collation;
 
  537                        $sql = 
"CREATE DATABASE ".$a_name.
 
  538                                " CHARACTER SET ".$a_charset;
 
  541                return $this->
query($sql, 
false);
 
  552        function createTable($a_name, $a_definition_array, $a_drop_table = 
false,
 
  553                $a_ignore_erros = 
false)
 
  558                        $this->
raisePearError(
"ilDB Error: createTable(".$a_name.
")<br />".
 
  565                        $this->
raisePearError(
"ilDB Error: createTable(".$a_name.
")<br />".
 
  576                $manager = $this->db->loadModule(
'Manager');
 
  577                $r = $manager->createTable($a_name, $a_definition_array, 
$options);
 
  598        function dropTable($a_name, $a_error_if_not_existing = 
true)
 
  600                if (!$a_error_if_not_existing)
 
  603                        if (!in_array($a_name, $tables))
 
  609                $manager = $this->db->loadModule(
'Manager');
 
  614                        $constraints = $manager->listTableConstraints($a_name);
 
  615                        $this->
handleError($constraints, 
"dropTable(".$a_name.
"), listTableConstraints");
 
  616                        foreach ($constraints as $c)
 
  618                                if (
substr($c, 0, 4) != 
"sys_")
 
  620                                        $r = $manager->dropConstraint($a_name, $c);
 
  621                                        $this->
handleError(
$r, 
"dropTable(".$a_name.
"), dropConstraint");
 
  626                        $indexes = $manager->listTableIndexes($a_name);
 
  627                        $this->
handleError($indexes, 
"dropTable(".$a_name.
"), listTableIndexes");
 
  628                        foreach ($indexes as $i)
 
  630                                $r = $manager->dropIndex($a_name, $i);
 
  636                $seqs = $manager->listSequences();
 
  637                if (in_array($a_name, $seqs))
 
  639                        $r = $manager->dropSequence($a_name);
 
  640                        $this->
handleError(
$r, 
"dropTable(".$a_name.
"), dropSequence");
 
  644                $r = $manager->dropTable($a_name);
 
  656                if ($a_options == 
"")
 
  658                        $a_options = array();
 
  661                $manager = $this->db->loadModule(
'Manager');
 
  662                $r = $manager->alterTable($a_name, $a_changes, 
false);
 
  678                $manager = $this->db->loadModule(
'Manager');
 
  682                        $this->
raisePearError(
"ilDB Error: addTableColumn(".$a_table.
", ".$a_column.
")<br />".
 
  687                        $this->
raisePearError(
"ilDB Error: addTableColumn(".$a_table.
", ".$a_column.
")<br />".
 
  693                                $a_column => $a_attributes
 
  697                $r = $manager->alterTable($a_table, $changes, 
false);
 
  699                return $this->
handleError(
$r, 
"addTableColumn(".$a_table.
", ".$a_column.
")");
 
  712                $manager = $this->db->loadModule(
'Manager');
 
  720                $r = $manager->alterTable($a_table, $changes, 
false);
 
  722                return $this->
handleError(
$r, 
"dropTableColumn(".$a_table.
", ".$a_column.
")");
 
  735                $manager = $this->db->loadModule(
'Manager');
 
  736                $reverse = $this->db->loadModule(
'Reverse');
 
  737                $def = $reverse->getTableFieldDefinition($a_table, $a_column);
 
  739                $this->
handleError($def, 
"modifyTableColumn(".$a_table.
")");
 
  741                if (is_file(
"./Services/Database/classes/class.ilDBAnalyzer.php"))
 
  743                        include_once(
"./Services/Database/classes/class.ilDBAnalyzer.php");
 
  747                        include_once(
"../Services/Database/classes/class.ilDBAnalyzer.php");
 
  750                $best_alt = $analyzer->getBestDefinitionAlternative($def);
 
  751                $def = $def[$best_alt];
 
  752                unset($def[
"nativetype"]);
 
  753                unset($def[
"mdb2type"]);
 
  756                $type = ($a_attributes[
"type"] != 
"")
 
  757                        ? $a_attributes[
"type"]
 
  759                foreach ($def as $k => $v)
 
  761                        if ($k != 
"type" && !in_array($k, $this->allowed_attributes[$type]))
 
  767                foreach ($a_attributes as $k => $v)
 
  769                        $check_array[$k] = $v;
 
  773                        $this->
raisePearError(
"ilDB Error: modifyTableColumn(".$a_table.
", ".$a_column.
")<br />".
 
  778                if ($this->getDbType() == 
"oracle")
 
  780                        if ($def[
"notnull"] == 
true && ($a_attributes[
"notnull"] == 
true 
  781                                || !isset($a_attributes[
"notnull"])))
 
  783                                unset($def[
"notnull"]);
 
  784                                unset($a_attributes[
"notnull"]);
 
  786                        if ($def[
"notnull"] == 
false && ($a_attributes[
"notnull"] == 
false 
  787                                || !isset($a_attributes[
"notnull"])))
 
  789                                unset($def[
"notnull"]);
 
  790                                unset($a_attributes[
"notnull"]);
 
  793                foreach ($a_attributes as $a => $v)
 
  798                $a_attributes[
"definition"] = $def;
 
  802                                $a_column => $a_attributes
 
  806                $r = $manager->alterTable($a_table, $changes, 
false);
 
  808                return $this->
handleError(
$r, 
"modifyTableColumn(".$a_table.
")");
 
  824                        $this->
raisePearError(
"ilDB Error: renameTableColumn(".$a_table.
",".$a_column.
",".$a_new_column.
")<br />".
 
  828                $manager = $this->db->loadModule(
'Manager');
 
  829                $reverse = $this->db->loadModule(
'Reverse');
 
  830                $def = $reverse->getTableFieldDefinition($a_table, $a_column);
 
  832                $this->
handleError($def, 
"renameTableColumn(".$a_table.
",".$a_column.
",".$a_new_column.
")");
 
  834                if (is_file(
"./Services/Database/classes/class.ilDBAnalyzer.php"))
 
  836                        include_once(
"./Services/Database/classes/class.ilDBAnalyzer.php");
 
  840                        include_once(
"../Services/Database/classes/class.ilDBAnalyzer.php");
 
  844                $best_alt = $analyzer->getBestDefinitionAlternative($def);
 
  845                $def = $def[$best_alt];
 
  846                unset($def[
"nativetype"]);
 
  847                unset($def[
"mdb2type"]);
 
  849                $f[
"definition"] = $def;
 
  850                $f[
"name"] = $a_new_column;
 
  858                $r = $manager->alterTable($a_table, $changes, 
false);
 
  860                return $this->
handleError(
$r, 
"renameTableColumn(".$a_table.
",".$a_column.
",".$a_new_column.
")");
 
  874                        $this->
raisePearError(
"ilDB Error: renameTable(".$a_name.
",".$a_new_name.
")<br />".
 
  878                $manager = $this->db->loadModule(
'Manager');
 
  879                $r = $manager->alterTable($a_name, array(
"name" => $a_new_name), 
false);
 
  881                $query = 
"UPDATE abstraction_progress ".
 
  882                        "SET table_name = ".$this->db->quote($a_new_name,
'text').
" ".
 
  883                        "WHERE table_name = ".$this->db->quote($a_name,
'text');
 
  886                return $this->
handleError(
$r, 
"renameTable(".$a_name.
",".$a_new_name.
")");
 
  898                $manager = $this->db->loadModule(
'Manager');
 
  901                foreach ($a_fields as $f)
 
  903                        $fields[$f] = array();
 
  905                $definition = array (
 
  909                $r = $manager->createConstraint($a_table,
 
  912                return $this->
handleError(
$r, 
"addPrimaryKey(".$a_table.
")");
 
  931                $manager = $this->db->loadModule(
'Manager');
 
  933                $r = $manager->dropConstraint($a_table,
 
  936                return $this->
handleError(
$r, 
"dropPrimaryKey(".$a_table.
")");
 
  946        function addIndex($a_table, $a_fields, $a_name = 
"in", $a_fulltext = 
false)
 
  948                $manager = $this->db->loadModule(
'Manager');
 
  953                        $this->
raisePearError(
"ilDB Error: addIndex(".$a_table.
",".$a_name.
")<br />".
 
  958                foreach ($a_fields as $f)
 
  960                        $fields[$f] = array();
 
  962                $definition = array (
 
  968                        $r = $manager->createIndex($a_table, $this->
constraintName($a_table, $a_name), $definition);
 
 1005                $manager = $this->db->loadModule(
'Manager');
 
 1006                $reverse = $this->db->loadModule(
'Reverse');
 
 1009                        foreach($manager->listTableIndexes($a_table) as $idx_name)
 
 1011                                $def = $reverse->getTableIndexDefinition($a_table,$idx_name);
 
 1012                                $idx_fields = array_keys((array) $def[
'fields']);
 
 1014                                if($idx_fields === $a_fields)
 
 1031                $manager = $this->db->loadModule(
'Manager');
 
 1032                $reverse = $this->db->loadModule(
'Reverse');
 
 1035                        foreach($manager->listTableIndexes($a_table) as $idx_name)
 
 1037                                $def = $reverse->getTableIndexDefinition($a_table,$idx_name);
 
 1038                                $idx_fields = array_keys((array) $def[
'fields']);
 
 1040                                if($idx_fields === $a_fields)
 
 1042                                        return $this->
dropIndex($a_table, $idx_name);
 
 1059                $manager = $this->db->loadModule(
'Manager');
 
 1063                        $r = $manager->dropIndex($a_table, $this->
constraintName($a_table, $a_name));
 
 1067                        $this->dropFulltextIndex($a_table, $a_name);
 
 1082                $manager = $this->db->loadModule(
'Manager');
 
 1087                        $this->
raisePearError(
"ilDB Error: addUniqueConstraint(".$a_table.
",".$a_name.
")<br />".
 
 1092                foreach ($a_fields as $f)
 
 1094                        $fields[$f] = array();
 
 1096                $definition = array (
 
 1101                $r = $manager->createConstraint($a_table, $this->
constraintName($a_table, $a_name), $definition);
 
 1103                return $this->
handleError(
$r, 
"addUniqueConstraint(".$a_table.
")");
 
 1115                $manager = $this->db->loadModule(
'Manager');
 
 1117                $r = $manager->dropConstraint(
 
 1121                return $this->
handleError(
$r, 
"dropUniqueConstraint(".$a_table.
")");
 
 1132                if (is_file(
"./Services/Database/classes/class.ilDBAnalyzer.php"))
 
 1134                        include_once(
"./Services/Database/classes/class.ilDBAnalyzer.php");
 
 1138                        include_once(
"../Services/Database/classes/class.ilDBAnalyzer.php");
 
 1141                $cons = $analyzer->getConstraintsInformation($a_table);
 
 1142                foreach ($cons as $c)
 
 1144                        if ($c[
"type"] == 
"unique" && count($a_fields) == count($c[
"fields"]))
 
 1147                                foreach ($a_fields as $f)
 
 1149                                        if (!isset($c[
"fields"][$f]))
 
 1168                $manager = $this->db->loadModule(
'Manager');
 
 1170                $r = $manager->createSequence($a_table_name, $a_start);
 
 1172                return $this->
handleError(
$r, 
"createSequence(".$a_table_name.
")");
 
 1181                $manager = $this->db->loadModule(
'Manager');
 
 1183                $r = $manager->dropSequence($a_table_name);
 
 1185                return $this->
handleError(
$r, 
"dropSequence(".$a_table_name.
")");
 
 1195                if (!preg_match (
"/^[a-z]+[_a-z0-9]*$/", $a_name))
 
 1197                        $this->error_str = 
"Table name must only contain _a-z0-9 and must start with a-z.";
 
 1203                        $this->error_str = 
"Invalid table name '".$a_name.
"' (Reserved Word).";
 
 1207                if (strtolower(
substr($a_name, 0, 4)) == 
"sys_")
 
 1209                        $this->error_str = 
"Invalid table name '".$a_name.
"'. Name must not start with 'sys_'.";
 
 1213                if (strlen($a_name) > 22)
 
 1215                        $this->error_str = 
"Invalid table name '".$a_name.
"'. Maximum table identifer length is 22 bytes.";
 
 1229                foreach ($a_cols as $col => $def)
 
 1266                if (!in_array($a_def[
"type"], array(
"text", 
"integer", 
"float", 
"date", 
"time", 
"timestamp", 
"clob", 
"blob")))
 
 1268                        switch ($a_def[
"type"])
 
 1271                                        $this->error_str = 
"Invalid column type '".$a_def[
"type"].
"'. Use integer(1) instead.";
 
 1275                                        $this->error_str = 
"Invalid column type '".$a_def[
"type"].
"'. Use float or integer instead.";
 
 1279                                        $this->error_str = 
"Invalid column type '".$a_def[
"type"].
"'. Allowed types are: ".
 
 1280                                                "text, integer, float, date, time, timestamp, clob and blob.";
 
 1287                foreach ($a_def as $k => $v)
 
 1291                                $this->error_str = 
"Attribute '".$k.
"' is not allowed for column type '".$a_def[
"type"].
"'.";
 
 1297                switch ($a_def[
"type"])
 
 1300                                if ($a_def[
"length"] < 1 || $a_def[
"length"] > 4000)
 
 1302                                        if (!$a_modify_mode || isset($a_def[
"length"]))
 
 1304                                                $this->error_str = 
"Invalid length '".$a_def[
"length"].
"' for type text.".
 
 1305                                                        " Length must be >=1 and <= 4000.";
 
 1312                                if (!in_array($a_def[
"length"], array(1, 2, 3, 4, 8)))
 
 1314                                        if (!$a_modify_mode || isset($a_def[
"length"]))
 
 1316                                                $this->error_str = 
"Invalid length '".$a_def[
"length"].
"' for type integer.".
 
 1317                                                        " Length must be 1, 2, 3, 4 or 8 (bytes).";
 
 1321                                if ($a_def[
"unsigned"])
 
 1323                                        $this->error_str = 
"Unsigned attribut must not be true for type integer.";
 
 1339                if (!preg_match (
"/^[a-z]+[_a-z0-9]*$/", $a_name))
 
 1341                        $this->error_str = 
"Invalid column name '".$a_name.
"'. Column name must only contain _a-z0-9 and must start with a-z.";
 
 1347                        $this->error_str = 
"Invalid column name '".$a_name.
"' (Reserved Word).";
 
 1351                if (strtolower(
substr($a_name, 0, 4)) == 
"sys_")
 
 1353                        $this->error_str = 
"Invalid column name '".$a_name.
"'. Name must not start with 'sys_'.";
 
 1357                if (strlen($a_name) > 30)
 
 1359                        $this->error_str = 
"Invalid column name '".$a_name.
"'. Maximum column identifer length is 30 bytes.";
 
 1373                if (!preg_match (
"/^[a-z]+[_a-z0-9]*$/", $a_name))
 
 1375                        $this->error_str = 
"Invalid column name '".$a_name.
"'. Column name must only contain _a-z0-9 and must start with a-z.";
 
 1381                        $this->error_str = 
"Invalid column name '".$a_name.
"' (Reserved Word).";
 
 1385                if (strlen($a_name) > 3)
 
 1387                        $this->error_str = 
"Invalid index name '".$a_name.
"'. Maximum index identifer length is 3 bytes.";
 
 1406                return $a_constraint;
 
 1415                include_once(
"./Services/Database/classes/class.ilDBMySQL.php");
 
 1417                if (in_array(strtoupper($a_word), $mysql_reserved_words))
 
 1421                include_once(
"./Services/Database/classes/class.ilDBOracle.php");
 
 1423                if (in_array(strtoupper($a_word), $oracle_reserved_words))
 
 1427                include_once(
"./Services/Database/classes/class.ilDBPostgreSQL.php");
 
 1429                if (in_array(strtoupper($a_word), $postgres_reserved_words))
 
 1450        function query($sql, $a_handle_error = 
true)
 
 1458                $r = $this->db->query($sql);
 
 1464                if ($a_handle_error)
 
 1479        function queryF($a_query, $a_types, $a_values)
 
 1481                if (!is_array($a_types) || !is_array($a_values) ||
 
 1482                        count($a_types) != count($a_values))
 
 1484                        $this->
raisePearError(
"ilDB::queryF: Types and values must be arrays of same size. ($a_query)");
 
 1486                $quoted_values = array();
 
 1487                foreach($a_types as $k => 
$t)
 
 1489                        $quoted_values[] = $this->
quote($a_values[$k], 
$t);
 
 1491                $query = vsprintf($a_query, $quoted_values);
 
 1505                if (!is_array($a_types) || !is_array($a_values) ||
 
 1506                        count($a_types) != count($a_values))
 
 1508                        $this->
raisePearError(
"ilDB::manipulateF: types and values must be arrays of same size. ($a_query)");
 
 1510                $quoted_values = array();
 
 1511                foreach($a_types as $k => 
$t)
 
 1513                        $quoted_values[] = $this->
quote($a_values[$k], 
$t);
 
 1515                $query = vsprintf($a_query, $quoted_values);
 
 1525                $pos1 = strpos(strtolower($sql), 
"from ");
 
 1529                        $tablef = 
substr($sql, $pos1+5);
 
 1530                        $pos2 = strpos(strtolower($tablef), 
" ");
 
 1533                                $table =
substr($tablef, 0, $pos2);
 
 1540                if (trim($table) != 
"")
 
 1542                        if (!is_array($this->ttt) || !in_array($table, $this->ttt))
 
 1545                                $this->ttt[] = $table;
 
 1550                        echo 
"<br><b>".$sql.
"</b>";
 
 1559                $this->db->setLimit($a_limit, $a_offset);
 
 1570                $r = $this->db->nextId($a_table_name, 
false);
 
 1593                $r = $this->db->exec($sql);
 
 1610        function prepare($a_query, $a_types = 
null, $a_result_types = 
null)
 
 1612                $res = $this->db->prepare($a_query, $a_types, $a_result_types);
 
 1642                $res = $a_stmt->execute($a_data);
 
 1658                $res = $this->db->extended->executeMultiple($a_stmt,$a_data);
 
 1660                return $this->
handleError(
$res, 
"executeMultiple(".$a_stmt->query.
")");
 
 1672                $field_values = array();
 
 1673                $placeholders = array();
 
 1678                foreach ($a_columns as $k => $col)
 
 1681                        $placeholders[] = 
"%s";
 
 1682                        $placeholders2[] = 
":$k";
 
 1686                        if ($col[0] == 
'integer' && !is_null($col[1]))
 
 1688                                $col[1] = (int) $col[1];
 
 1691                        $values[] = $col[1];
 
 1692                        $field_values[$k] = $col[1];
 
 1693                        if ($col[0] == 
"blob" || $col[0] == 
"clob")
 
 1701                        $st = $this->db->prepare(
"INSERT INTO ".$a_table.
" (".implode($fields,
",").
") VALUES (".
 
 1704                        $this->
handleError($st, 
"insert / prepare/execute(".$a_table.
")");
 
 1706                        $r = $st->execute($field_values);
 
 1710                        $this->
handleError(
$r, 
"insert / prepare/execute(".$a_table.
")");
 
 1715                        $q = 
"INSERT INTO ".$a_table.
" (".implode($fields,
",").
") VALUES (".
 
 1716                                implode($placeholders,
",").
")";
 
 1730        function update($a_table, $a_columns, $a_where)
 
 1733                $field_values = array();
 
 1734                $placeholders = array();
 
 1739                foreach ($a_columns as $k => $col)
 
 1742                        $placeholders[] = 
"%s";
 
 1743                        $placeholders2[] = 
":$k";
 
 1747                        if ($col[0] == 
'integer' && !is_null($col[1]))
 
 1749                                $col[1] = (int) $col[1];
 
 1752                        $values[] = $col[1];
 
 1753                        $field_values[$k] = $col[1];
 
 1754                        if ($col[0] == 
"blob" || $col[0] == 
"clob")
 
 1763                        $q = 
"UPDATE ".$a_table.
" SET ";
 
 1765                        foreach ($fields as $k => $field)
 
 1767                                $q.= $lim.$field.
" = ".$placeholders2[$k];
 
 1772                        foreach ($a_where as $k => $col)
 
 1774                                $q.= $lim.$k.
" = ".$this->
quote($col[1], $col[0]);
 
 1778                        $r = $st->execute($field_values);
 
 1781                        $this->
handleError(
$r, 
"update / prepare/execute(".$a_table.
")");
 
 1786                        foreach ($a_where as $k => $col)
 
 1789                                $values[] = $col[1];
 
 1790                                $field_values[$k] = $col;
 
 1792                        $q = 
"UPDATE ".$a_table.
" SET ";
 
 1794                        foreach ($fields as $k => $field)
 
 1796                                $q.= $lim.$field.
" = ".$placeholders[$k];
 
 1801                        foreach ($a_where as $k => $col)
 
 1803                                $q.= $lim.$k.
" = %s";
 
 1819        function replace($a_table, $a_pk_columns, $a_other_columns)
 
 1822                $a_columns = array_merge($a_pk_columns, $a_other_columns);
 
 1824                $field_values = array();
 
 1825                $placeholders = array();
 
 1830                foreach ($a_columns as $k => $col)
 
 1833                        $placeholders[] = 
"%s";
 
 1834                        $placeholders2[] = 
":$k";
 
 1838                        if ($col[0] == 
'integer' && !is_null($col[1]))
 
 1840                                $col[1] = (int) $col[1];
 
 1843                        $values[] = $col[1];
 
 1844                        $field_values[$k] = $col[1];
 
 1845                        if ($col[0] == 
"blob" || $col[0] == 
"clob")
 
 1853                        $st = $this->db->prepare(
"REPLACE INTO ".$a_table.
" (".implode($fields,
",").
") VALUES (".
 
 1855                        $this->
handleError($st, 
"insert / prepare/execute(".$a_table.
")");
 
 1856                        $r = $st->execute($field_values);
 
 1858                        $this->
handleError(
$r, 
"insert / prepare/execute(".$a_table.
")");
 
 1863                        $q = 
"REPLACE INTO ".$a_table.
" (".implode($fields,
",").
") VALUES (".
 
 1864                                implode($placeholders,
",").
")";
 
 1885                return $a_st->free();
 
 1905                return $a_set->numRows();
 
 1923        function in($a_field, $a_values, $negate = 
false, $a_type = 
"")
 
 1925                if (count($a_values) == 0)
 
 1929                        return $negate ? 
' 1=1 ' : 
' 1=2 ';
 
 1934                        $str = $a_field.(($negate) ? 
" NOT" : 
"").
" IN (?".str_repeat(
",?", count($a_values) - 1).
")";
 
 1938                        $str = $a_field.(($negate) ? 
" NOT" : 
"").
" IN (";
 
 1940                        foreach ($a_values as $v)
 
 1942                                $str.= $sep.$this->quote($v, $a_type);
 
 1956                if (!is_array($a_arr))
 
 1962                        $type_arr = array_fill(0, $a_cnt, $a_type);
 
 1966                        $type_arr = array();
 
 1968                return array_merge($a_arr, $type_arr);
 
 1990        public function concat($a_values,$a_allow_null = 
true)
 
 1992                if(!count($a_values))
 
 1997                $concat = 
' CONCAT(';
 
 1999                foreach($a_values as $field_info)
 
 2001                        $val = $field_info[0];
 
 2010                                $concat .= 
'COALESCE(';
 
 2032        function substr($a_exp, $a_pos = 1, $a_len = -1)
 
 2037                        $lenstr = 
", ".$a_len;
 
 2039                return " SUBSTR(".$a_exp.
", ".$a_pos.$lenstr.
") ";
 
 2050                return " UPPER(".$a_exp.
") ";
 
 2061                return " LOWER(".$a_exp.
") ";
 
 2071        public function locate($a_needle,$a_string,$a_start_pos = 1)
 
 2073                $locate = 
' LOCATE( ';
 
 2074                $locate .= $a_needle;
 
 2076                $locate .= $a_string;
 
 2078                $locate .= $a_start_pos;
 
 2089        function like($a_col, $a_type, $a_value = 
"?", $case_insensitive = 
true)
 
 2091                if (!in_array($a_type, array(
"text", 
"clob", 
"blob")))
 
 2093                        $this->
raisePearError(
"Like: Invalid column type '".$a_type.
"'.", $this->error_class->FATAL);
 
 2095                if ($a_value == 
"?")
 
 2097                        if ($case_insensitive)
 
 2099                                return "UPPER(".$a_col.
") LIKE(UPPER(?))";
 
 2103                                return $a_col .
" LIKE(?)";
 
 2108                        if ($case_insensitive)
 
 2111                                return " UPPER(".$a_col.
") LIKE(UPPER(".$this->
quote($a_value, 
'text').
"))";
 
 2116                                return " ".$a_col.
" LIKE(".$this->
quote($a_value, 
'text').
")";
 
 2125        function equals($a_col, $a_value, $a_type, $a_empty_or_null = 
false)
 
 2127                if (!$a_empty_or_null || $a_value != 
"")
 
 2129                        return $a_col.
" = ".$this->
quote($a_value, $a_type);
 
 2133                        return "(".$a_col.
" = '' OR $a_col IS NULL)";
 
 2140        function equalsNot($a_col, $a_value, $a_type, $a_empty_or_null = 
false)
 
 2142                if (!$a_empty_or_null)
 
 2144                        return $a_col.
" <> ".$this->
quote($a_value, $a_type);
 
 2148                        return "(".$a_col.
" <> ".$this->
quote($a_value, $a_type). 
" OR ".
 
 2153                        return "(".$a_col.
" <> '' AND $a_col IS NOT NULL)";
 
 2165                return "FROM_UNIXTIME(".$a_expr.
")";
 
 2173                return "UNIX_TIMESTAMP()";
 
 2199                if (is_array($tables))
 
 2201                        if (in_array($a_table, $tables))
 
 2219                $column_visibility = 
false;
 
 2220                $manager = $this->db->loadModule(
'Manager');
 
 2221                $r = $manager->listTableFields($a_table);
 
 2225                        foreach(
$r as $field)
 
 2227                                if ($field == $a_column_name)
 
 2229                                        $column_visibility = 
true;
 
 2234                return $column_visibility;
 
 2246                if (is_file(
"./Services/Database/classes/class.ilDBAnalyzer.php"))
 
 2248                        include_once(
"./Services/Database/classes/class.ilDBAnalyzer.php");
 
 2252                        include_once(
"../Services/Database/classes/class.ilDBAnalyzer.php");
 
 2255                $cons = $analyzer->getConstraintsInformation($a_table);
 
 2256                foreach ($cons as $c)
 
 2258                        if ($c[
"type"] == 
"unique" && count($a_fields) == count($c[
"fields"]))
 
 2261                                foreach ($a_fields as $f)
 
 2263                                        if (!isset($c[
"fields"][$f]))
 
 2285                $manager = $this->db->loadModule(
'Manager');
 
 2286                $r = $manager->listTables();
 
 2306                if (is_array($sequences))
 
 2308                        if (in_array($a_sequence, $sequences))
 
 2323                $manager = $this->db->loadModule(
'Manager');
 
 2324                $r = $manager->listSequences();
 
 2342        function quote($a_query, $a_type = 
null)
 
 2344                if ($a_query == 
"" && is_null($a_type))
 
 2350                if($a_type == 
'integer' && !is_null($a_query))
 
 2352                        return (
int) $a_query;
 
 2355                if ($a_type == 
"blob" || $a_type == 
"clob")
 
 2357                        $this->
raisePearError(
"ilDB::quote: Quoting not allowed on type '".$a_type.
"'. Please use ilDB->insert and ilDB->update to write clobs.", $this->error_class->FATAL);
 
 2360                return $this->db->quote($a_query, $a_type);
 
 2372                return $this->db->quoteIdentifier($a_identifier);
 
 2387                if (!$this->db->supports(
'transactions'))
 
 2389                        $this->
raisePearError(
"ilDB::beginTransaction: Transactions are not supported.", $this->error_class->FATAL);
 
 2391                $res = $this->db->beginTransaction();
 
 2401                $res = $this->db->commit();
 
 2411                $res = $this->db->rollback();
 
 2446                $res = $this->db->autoExecute($a_tablename,$a_fields,$a_mode,$a_where);
 
 2462                $res = $this->db->lastInsertId();
 
 2482                $set = $this->db->query($sql);
 
 2505                $set = $this->
query($sql);
 
 2506                $r = $set->fetchRow($mode);
 
 2521                $this->sub_type = (string)$a_value;
 
const MDB2_AUTOQUERY_UPDATE
const MDB2_AUTOQUERY_SELECT
const MDB2_AUTOQUERY_INSERT
Used by autoPrepare()
const MDB2_AUTOQUERY_DELETE
const MDB2_PORTABILITY_ALL
Portability: turn on all portability features.
const MDB2_PORTABILITY_FIX_CASE
Portability: convert names of tables and fields to case defined in the "field_case" option when using...
const MDB2_PREPARE_MANIP
These are just helper constants to more verbosely express parameters to prepare()
const MDB2_PORTABILITY_EMPTY_TO_NULL
Portability: convert empty values to null strings in data output by query*() and fetch*().
const MDB2_FETCHMODE_OBJECT
Column data as object properties.
const MDB2_FETCHMODE_ASSOC
Column data indexed by column names.
const PEAR_ERROR_CALLBACK
isError($data, $code=null)
Tell whether a value is a MDB2 error.
& connect($dsn, $options=false)
Create a new MDB2 connection object and connect to the specified database.
setErrorHandling($mode=null, $options=null)
Sets how errors generated by this object should be handled.
& raiseError($message=null, $code=null, $mode=null, $options=null, $userinfo=null, $error_class=null, $skipmsg=false)
This method is a wrapper that returns an instance of the configured error class with this object's de...
const DB_FETCHMODE_OBJECT
readVariable($a_group, $a_var_name)
reads a single variable from a group @access public
This class gives all kind of DB information using the MDB2 manager and reverse module.
static getReservedWords()
Get reserved words.
static getReservedWords()
Get reserved words.
static getReservedWords()
Get reserved words.
replace($a_table, $a_pk_columns, $a_other_columns)
Replace into method.
lockTables($a_tables)
Abstraction of lock table.
listTables()
Get all tables.
tableColumnExists($a_table, $a_column_name)
Checks for the existence of a table column.
equals($a_col, $a_value, $a_type, $a_empty_or_null=false)
Use this only on text fields.
initFromIniFile($tmpClientIniFile=null)
Init db parameters from ini file.
executeMultiple($a_stmt, $a_data)
Execute a query statement prepared by either prepare() or prepareManip() with multiple data arrays.
manipulate($sql)
Data manipulation.
fetchObject($a_set)
Fetch row as object from result set.
setSubType($a_value)
Set sub type.
checkTableColumns($a_cols)
Check table columns definition.
createTable($a_name, $a_definition_array, $a_drop_table=false, $a_ignore_erros=false)
Create a new table in the database.
connectHost()
Sets up a host connection only (no specific database used).
createSequence($a_table_name, $a_start=1)
Create a sequence for a table.
enableResultBuffering($a_status)
En/disable result buffering.
addTableColumn($a_table, $a_column, $a_attributes)
Add table column Use this only on aleady "abstracted" tables.
getDBPort()
Get database port.
update($a_table, $a_columns, $a_where)
Convenient method for standard update statements, example field array:
getPrimaryKeyIdentifier()
Primary key identifier.
getLastInsertId()
Get last insert id.
rollback()
Rollback a transaction.
dropSequence($a_table_name)
Drop a sequence for a table.
connect($a_return_false_for_error=false)
Open the connection.
renameTable($a_name, $a_new_name)
Rename a table.
dropPrimaryKey($a_table)
Drop a primary key from a table.
quoteIdentifier($a_identifier)
Quote table and field names.
tableExists($a_table)
Check, whether a given table exists.
getRow($sql, $mode=DB_FETCHMODE_OBJECT)
getRow.
queryF($a_query, $a_types, $a_values)
Formatted query (for SELECTS).
in($a_field, $a_values, $negate=false, $a_type="")
Get abstract in-clause for given array.
static isReservedWord($a_word)
Checks whether a word is a reserved word in one of the supported databases.
handleError($a_res, $a_info="", $a_level="")
Handle MDB2 Errors.
nextId($a_table_name)
Get next ID for an index.
modifyTableColumn($a_table, $a_column, $a_attributes)
Modify a table column Use this only on aleady "abstracted" tables.
getDBUser()
Get database user.
uniqueConstraintExists($a_table, $a_fields)
Checks if a unique constraint exists based on the fields of the unique constraint (not the name)
unixTimestamp()
Unix timestamp.
getDBName()
Get database name.
constraintName($a_table, $a_constraint)
Determine contraint name by table name and constraint name.
concat($a_values, $a_allow_null=true)
Abstraction of SQL function CONCAT.
doConnect()
Standard way to connect to db.
addTypesToArray($a_arr, $a_type, $a_cnt)
Adds a type x times to an array.
manipulateF($a_query, $a_types, $a_values)
Formatted manupulate (for DELETE, UPDATE, INSERT).
free($a_st)
Free a statement / result set.
checkIndexName($a_name)
Check whether an index name is valid.
setDBUser($a_user)
Set database user.
supportsSlave()
Supports slave.
getDBVersion()
Get DB version.
checkTableName($a_name)
Check whether a table name is valid.
static getReservedWords()
Get reserved words.
createDatabase($a_name, $a_charset="utf8", $a_collation="")
Create database.
dropUniqueConstraint($a_table, $a_name="con")
Drop a constraint from a table.
renameTableColumn($a_table, $a_column, $a_new_column)
Rename a table column Use this only on aleady "abstracted" tables.
like($a_col, $a_type, $a_value="?", $case_insensitive=true)
Like.
numRows($a_set)
Fetch row as associative array from result set.
equalsNot($a_col, $a_value, $a_type, $a_empty_or_null=false)
Use this only on text fields.
setLimit($a_limit, $a_offset=0)
Set limit and offset for a query.
checkColumnDefinition($a_def, $a_modify_mode=false)
Check whether a column definition is valid.
query($sql, $a_handle_error=true)
Query.
insert($a_table, $a_columns)
Convenient method for standard insert statements, example field array:
isFulltextIndex($a_table, $a_name)
Is index a fulltext index?
setDBPort($a_port)
Set database port.
optimizeTable($a_table)
Optimize Table.
initHostConnection()
Initialize the host connection (no specific database)
dropUniqueConstraintByFields($a_table, $a_fields)
Drop constraint by field(s)
getCreateTableOptions()
Get options for the create table statement.
addUniqueConstraint($a_table, $a_fields, $a_name="con")
Add a unique constraint to a table.
logStatement($sql)
Helper function, should usually not be called.
dropTable($a_name, $a_error_if_not_existing=true)
Drop a table.
static isDbError($a_res)
Check error.
alterTable($a_name, $a_changes)
Alter a table in the database This method is DEPRECATED, see http://www.ilias.de/docu/goto....
commit()
Commit a transaction.
checkColumnName($a_name)
Check whether a column name is valid.
setDBName($a_name)
Set database name.
checkColumn($a_col, $a_def)
Check column definition.
getSubType()
Get sub type.
dropIndex($a_table, $a_name="in")
Drop an index from a table.
beginTransaction()
Begin Transaction.
raisePearError($a_message, $a_level="")
Raise an error.
addIndex($a_table, $a_fields, $a_name="in", $a_fulltext=false)
Add an index to a table.
prepare($a_query, $a_types=null, $a_result_types=null)
Prepare a query (SELECT) statement to be used with execute.
setDBHost($a_host)
Set database host.
addPrimaryKey($a_table, $a_fields)
Add a primary key to a table.
execute($a_stmt, $a_data=null)
Execute a query statement prepared by either prepare() or prepareManip()
fetchAssoc($a_set)
Fetch row as associative array from result set.
getDBPassword()
Get database password.
substr($a_exp, $a_pos=1, $a_len=-1)
Substring.
indexExistsByFields($a_table, $a_fields)
Check if index exists.
sequenceExists($a_sequence)
Check, whether a given sequence exists.
fromUnixtime($a_expr, $a_to_text=true)
fromUnixtime (makes timestamp out of unix timestamp)
dropIndexByFields($a_table, $a_fields)
Drop index by field(s)
addFulltextIndex($a_table, $a_fields, $a_name="in")
Add fulltext index.
useSlave($a_val=true)
Use slave.
getHostDSN()
Should return a valid value, if host connections are possible (connectHost) to create a new database ...
unlockTables()
Unlock tables locked by previous lock table calls.
getDBHost()
Get database host.
autoExecute($a_tablename, $a_fields, $a_mode=MDB2_AUTOQUERY_INSERT, $a_where=false)
Wrapper for Pear autoExecute.
listSequences()
Get all sequences.
dropTableColumn($a_table, $a_column)
Drop table column Use this only on aleady "abstracted" tables.
locate($a_needle, $a_string, $a_start_pos=1)
Create locate string.
initConnection()
Initialize the database connection.
setDBPassword($a_password)
Set database password.
prepareManip($a_query, $a_types=null)
Prepare a data manipulation statement to be used with execute.
quote($a_query, $a_type=null)
Wrapper for quote method.
loadMDB2Extensions()
load additional mdb2 extensions and set their constants
if(!is_array($argv)) $options