="); var $_values = array(); function name() { return lang('Editor'); } //! driver, ns function credentials() { return array(SERVER, $_GET["username"], get_session("pwds")); } function permanentLogin() { return password_file(); } function database() { global $connection; $databases = get_databases(false); return (!$databases ? $connection->result("SELECT SUBSTRING_INDEX(CURRENT_USER, '@', 1)") // username without the database list : $databases[(information_schema($databases[0]) ? 1 : 0)] // first available database ); } function headers() { header("X-Frame-Options: deny"); header("X-XSS-Protection: 0"); } function loginForm() { ?>
"> | |
' . lang('New item') . "\n"; } echo ">>\n"; } function foreignKeys($table) { return foreign_keys($table); } function backwardKeys($table, $tableName) { $return = array(); foreach (get_rows("SELECT TABLE_NAME, CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_COLUMN_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = " . q($this->database()) . " AND REFERENCED_TABLE_SCHEMA = " . q($this->database()) . " AND REFERENCED_TABLE_NAME = " . q($table) . " ORDER BY ORDINAL_POSITION", null, "") as $row) { //! requires MySQL 5 $return[$row["TABLE_NAME"]]["keys"][$row["CONSTRAINT_NAME"]][$row["COLUMN_NAME"]] = $row["REFERENCED_COLUMN_NAME"]; } foreach ($return as $key => $val) { $name = $this->tableName(table_status($key)); if ($name != "") { $search = preg_quote($tableName); $separator = "(:|\\s*-)?\\s+"; $return[$key]["name"] = (preg_match("(^$search$separator(.+)|^(.+?)$separator$search\$)iu", $name, $match) ? $match[2] . $match[3] : $name); } else { unset($return[$key]); } } return $return; } function backwardKeysPrint($backwardKeys, $row) { foreach ($backwardKeys as $table => $backwardKey) { foreach ($backwardKey["keys"] as $cols) { $link = ME . 'select=' . urlencode($table); $i = 0; foreach ($cols as $column => $val) { $link .= where_link($i++, $column, $row[$val]); } echo "" . h($backwardKey["name"]) . ""; $link = ME . 'edit=' . urlencode($table); foreach ($cols as $column => $val) { $link .= "&set" . urlencode("[" . bracket_escape($column) . "]") . "=" . urlencode($row[$val]); } echo "+ "; } } } function selectQuery($query) { return "\n"; } function rowDescription($table) { // first varchar column foreach (fields($table) as $field) { if ($field["type"] == "varchar") { return idf_escape($field["field"]); } } return ""; } function rowDescriptions($rows, $foreignKeys) { $return = $rows; foreach ($rows[0] as $key => $val) { foreach ((array) $foreignKeys[$key] as $foreignKey) { if (count($foreignKey["source"]) == 1) { $id = idf_escape($foreignKey["target"][0]); $name = $this->rowDescription($foreignKey["table"]); if ($name != "") { // find all used ids $ids = array(); foreach ($rows as $row) { $ids[$row[$key]] = exact_value($row[$key]); } // uses constant number of queries to get the descriptions, join would be complex, multiple queries would be slow $descriptions = $this->_values[$foreignKey["table"]]; if (!$descriptions) { $descriptions = get_key_vals("SELECT $id, $name FROM " . idf_escape($foreignKey["table"]) . " WHERE $id IN (" . implode(", ", $ids) . ")"); } // use the descriptions foreach ($rows as $n => $row) { if (isset($row[$key])) { $return[$n][$key] = (string) $descriptions[$row[$key]]; } } break; } } } } return $return; } function selectVal($val, $link, $field) { $return = ($val == "NULL" ? " " : $val); if (ereg('blob|bytea', $field["type"]) && !is_utf8($val)) { $return = lang('%d byte(s)', strlen($val)); if (ereg("^(GIF|\xFF\xD8\xFF|\x89\x50\x4E\x47\x0D\x0A\x1A\x0A)", $val)) { // GIF|JPG|PNG, getimagetype() works with filename $return = ""; } } if ($field["full_type"] == "tinyint(1)" && $return != " ") { // bool $return = ''; } if ($link) { $return = "$return"; } if (!$link && $field["full_type"] != "tinyint(1)" && ereg('int|float|double|decimal', $field["type"])) { $return = "