/app/pages/sqlbuddy/includes/class/Sql.php
https://github.com/heavy-cloud/Codeita · PHP · 495 lines · 403 code · 69 blank · 23 comment · 209 complexity · c6a1c26821640f6dddf2d6c09c266e89 MD5 · raw file
- <?php
- /*
- SQL Buddy - Web based MySQL administration
- http://www.sqlbuddy.com/
- sql.php
- - sql class
- MIT license
- 2008 Calvin Lough <http://calv.in>
- */
- class SQL {
-
- var $adapter = "";
- var $method = "";
- var $version = "";
- var $conn = "";
- var $options = "";
- var $errorMessage = "";
- var $db = "";
-
- function SQL($connString, $user = "", $pass = "") {
- list($this->adapter, $options) = explode(":", $connString, 2);
-
- if ($this->adapter != "sqlite") {
- $this->adapter = "mysql";
- }
-
- $optionsList = explode(";", $options);
-
- foreach ($optionsList as $option) {
- list($a, $b) = explode("=", $option);
- $opt[$a] = $b;
- }
-
- $this->options = $opt;
- $database = (array_key_exists("database", $opt)) ? $opt['database'] : "";
-
- if ($this->adapter == "sqlite" && substr(sqlite_libversion(), 0, 1) == "3" && class_exists("PDO") && in_array("sqlite", PDO::getAvailableDrivers())) {
- $this->method = "pdo";
-
- try
- {
- $this->conn = new PDO("sqlite:" . $database, null, null, array(PDO::ATTR_PERSISTENT => true));
- }
- catch (PDOException $error) {
- $this->conn = false;
- $this->errorMessage = $error->getMessage();
- }
- } else if ($this->adapter == "sqlite" && substr(sqlite_libversion(), 0, 1) == "2" && class_exists("PDO") && in_array("sqlite2", PDO::getAvailableDrivers())) {
- $this->method = "pdo";
-
- try
- {
- $this->conn = new PDO("sqlite2:" . $database, null, null, array(PDO::ATTR_PERSISTENT => true));
- }
- catch (PDOException $error) {
- $this->conn = false;
- $this->errorMessage = $error->getMessage();
- }
- } else if ($this->adapter == "sqlite") {
- $this->method = "sqlite";
- $this->conn = sqlite_open($database, 0666, $sqliteError);
- } else {
- $this->method = "mysql";
- $host = (array_key_exists("host", $opt)) ? $opt['host'] : "";
- $this->conn = @mysql_connect($host, $user, $pass);
- }
-
- if ($this->conn && $this->method == "pdo") {
- $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
- }
-
- if ($this->conn && $this->adapter == "mysql") {
- $this->query("SET NAMES 'utf8'");
- }
-
- if ($this->conn && $database) {
- $this->db = $database;
- }
- }
-
- function isConnected() {
- return ($this->conn !== false);
- }
-
- function disconnect() {
- if ($this->conn) {
- if ($this->method == "pdo") {
- $this->conn = null;
- } else if ($this->method == "mysql") {
- mysql_close($this->conn);
- $this->conn = null;
- } else if ($this->method == "sqlite") {
- sqlite_close($this->conn);
- $this->conn = null;
- }
- }
- }
-
- function getAdapter() {
- return $this->adapter;
- }
-
- function getMethod() {
- return $this->method;
- }
-
- function getOptionValue($optKey) {
- if (array_key_exists($optKey, $this->options)) {
- return $this->options[$optKey];
- } else {
- return false;
- }
- }
-
- function selectDB($db) {
- if ($this->conn) {
- if ($this->method == "mysql") {
- $this->db = $db;
- return (mysql_select_db($db));
- } else {
- return true;
- }
- } else {
- return false;
- }
- }
- function query($queryText) {
- if ($this->conn) {
- if ($this->method == "pdo") {
- $queryResult = $this->conn->prepare($queryText);
-
- if ($queryResult)
- $queryResult->execute();
- if (!$queryResult) {
- $errorInfo = $this->conn->errorInfo();
- $this->errorMessage = $errorInfo[2];
- }
- return $queryResult;
- } else if ($this->method == "mysql") {
- $queryResult = @mysql_query($queryText, $this->conn);
- if (!$queryResult) {
- $this->errorMessage = mysql_error();
- }
- return $queryResult;
- } else if ($this->method == "sqlite") {
- $queryResult = sqlite_query($this->conn, $queryText);
- if (!$queryResult) {
- $this->errorMessage = sqlite_error_string(sqlite_last_error($this->conn));
- }
- return $queryResult;
- }
- } else {
- return false;
- }
- }
-
- // Be careful using this function - when used with pdo, the pointer is moved
- // to the end of the result set and the query needs to be rerun. Unless you
- // actually need a count of the rows, use the isResultSet() function instead
- function rowCount($resultSet) {
- if (!$resultSet)
- return false;
-
- if ($this->conn) {
- if ($this->method == "pdo") {
- return count($resultSet->fetchAll());
- } else if ($this->method == "mysql") {
- return @mysql_num_rows($resultSet);
- } else if ($this->method == "sqlite") {
- return @sqlite_num_rows($resultSet);
- }
- }
- }
-
- function isResultSet($resultSet) {
- if ($this->conn) {
- if ($this->method == "pdo") {
- return ($resultSet == true);
- } else {
- return ($this->rowCount($resultSet) > 0);
- }
- }
- }
- function fetchArray($resultSet) {
- if (!$resultSet)
- return false;
-
- if ($this->conn) {
- if ($this->method == "pdo") {
- return $resultSet->fetch(PDO::FETCH_NUM);
- } else if ($this->method == "mysql") {
- return mysql_fetch_row($resultSet);
- } else if ($this->method == "sqlite") {
- return sqlite_fetch_array($resultSet, SQLITE_NUM);
- }
- }
- }
- function fetchAssoc($resultSet) {
- if (!$resultSet)
- return false;
-
- if ($this->conn) {
- if ($this->method == "pdo") {
- return $resultSet->fetch(PDO::FETCH_ASSOC);
- } else if ($this->method == "mysql") {
- return mysql_fetch_assoc($resultSet);
- } else if ($this->method == "sqlite") {
- return sqlite_fetch_array($resultSet, SQLITE_ASSOC);
- }
- }
- }
- function affectedRows($resultSet) {
- if (!$resultSet)
- return false;
-
- if ($this->conn) {
- if ($this->method == "pdo") {
- return $resultSet->rowCount();
- } else if ($this->method == "mysql") {
- return @mysql_affected_rows($resultSet);
- } else if ($this->method == "sqlite") {
- return sqlite_changes($resultSet);
- }
- }
- }
-
- function result($resultSet, $targetRow, $targetColumn = "") {
- if (!$resultSet)
- return false;
-
- if ($this->conn) {
- if ($this->method == "pdo") {
- if ($targetColumn) {
- $resultRow = $resultSet->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_ABS, $targetRow);
- return $resultRow[$targetColumn];
- } else {
- $resultRow = $resultSet->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_ABS, $targetRow);
- return $resultRow[0];
- }
- } else if ($this->method == "mysql") {
- return mysql_result($resultSet, $targetRow, $targetColumn);
- } else if ($this->method == "sqlite") {
- return sqlite_column($resultSet, $targetColumn);
- }
- }
- }
-
- function listDatabases() {
- if ($this->conn) {
- if ($this->adapter == "mysql") {
- return $this->query("SHOW DATABASES");
- } else if ($this->adapter == "sqlite") {
- return $this->db;
- }
- }
- }
-
- function listTables() {
- if ($this->conn) {
- if ($this->adapter == "mysql") {
- return $this->query("SHOW TABLES");
- } else if ($this->adapter == "sqlite") {
- return $this->query("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name");
- }
- }
- }
-
- function hasCharsetSupport()
- {
- if ($this->conn) {
- if ($this->adapter == "mysql" && version_compare($this->getVersion(), "4.1", ">")) {
- return true;
- } else {
- return false;
- }
- }
- }
-
- function listCharset() {
- if ($this->conn) {
- if ($this->adapter == "mysql") {
- return $this->query("SHOW CHARACTER SET");
- } else if ($this->adapter == "sqlite") {
- return "";
- }
- }
- }
-
- function listCollation() {
- if ($this->conn) {
- if ($this->adapter == "mysql") {
- return $this->query("SHOW COLLATION");
- } else if ($this->adapter == "sqlite") {
- return "";
- }
- }
- }
-
- function insertId() {
- if ($this->conn) {
- if ($this->method == "pdo") {
- return $this->conn->lastInsertId();
- } else if ($this->method == "mysql") {
- return @mysql_insert_id($this->conn);
- } else if ($this->method == "sqlite") {
- return sqlite_last_insert_rowid($this-conn);
- }
- }
- }
- function escapeString($toEscape) {
- if ($this->conn) {
- if ($this->method == "pdo") {
- $toEscape = $this->conn->quote($toEscape);
- $toEscape = substr($toEscape, 1, -1);
- return $toEscape;
- } else if ($this->adapter == "mysql") {
- return mysql_real_escape_string($toEscape);
- } else if ($this->adapter == "sqlite") {
- return sqlite_escape_string($toEscape);
- }
- }
- }
-
- function getVersion() {
- if ($this->conn) {
- // cache
- if ($this->version) {
- return $this->version;
- }
-
- if ($this->adapter == "mysql") {
- $verSql = mysql_get_server_info();
- $version = explode("-", $verSql);
- $this->version = $version[0];
- return $this->version;
- } else if ($this->adapter == "sqlite") {
- $this->version = sqlite_libversion();
- return $this->version;
- }
- }
- }
-
- // returns the number of rows in a table
- function tableRowCount($table) {
- if ($this->conn) {
- if ($this->adapter == "mysql") {
- $countSql = $this->query("SELECT COUNT(*) AS `RowCount` FROM `" . $table . "`");
- $count = (int)($this->result($countSql, 0, "RowCount"));
- return $count;
- } else if ($this->adapter == "sqlite") {
- $countSql = $this->query("SELECT COUNT(*) AS 'RowCount' FROM '" . $table . "'");
- $count = (int)($this->result($countSql, 0, "RowCount"));
- return $count;
- }
- }
- }
-
- // gets column info for a table
- function describeTable($table) {
- if ($this->conn) {
- if ($this->adapter == "mysql") {
- return $this->query("DESCRIBE `" . $table . "`");
- } else if ($this->adapter == "sqlite") {
- $columnSql = $this->query("SELECT sql FROM sqlite_master where tbl_name = '" . $table . "'");
- $columnInfo = $this->result($columnSql, 0, "sql");
- $columnStart = strpos($columnInfo, '(');
- $columns = substr($columnInfo, $columnStart+1, -1);
- $columns = split(',[^0-9]', $columns);
-
- $columnList = array();
-
- foreach ($columns as $column) {
- $column = trim($column);
- $columnSplit = explode(" ", $column, 2);
- $columnName = $columnSplit[0];
- $columnType = (sizeof($columnSplit) > 1) ? $columnSplit[1] : "";
- $columnList[] = array($columnName, $columnType);
- }
-
- return $columnList;
- }
- }
- }
-
- /*
- Return names, row counts etc for every database, table and view in a JSON string
- */
- function getMetadata() {
- $output = '';
- if ($this->conn) {
- if ($this->adapter == "mysql" && version_compare($this->getVersion(), "5.0.0", ">=")) {
- $this->selectDB("information_schema");
- $schemaSql = $this->query("SELECT `SCHEMA_NAME` FROM `SCHEMATA` ORDER BY `SCHEMA_NAME`");
- if ($this->rowCount($schemaSql)) {
- while ($schema = $this->fetchAssoc($schemaSql)) {
- $output .= '{"name": "' . $schema['SCHEMA_NAME'] . '"';
- // other interesting columns: TABLE_TYPE, ENGINE, TABLE_COLUMN and many more
- $tableSql = $this->query("SELECT `TABLE_NAME`, `TABLE_ROWS` FROM `TABLES` WHERE `TABLE_SCHEMA`='" . $schema['SCHEMA_NAME'] . "' ORDER BY `TABLE_NAME`");
- if ($this->rowCount($tableSql)) {
- $output .= ',"items": [';
- while ($table = $this->fetchAssoc($tableSql)) {
-
- if ($schema['SCHEMA_NAME'] == "information_schema") {
- $countSql = $this->query("SELECT COUNT(*) AS `RowCount` FROM `" . $table['TABLE_NAME'] . "`");
- $rowCount = (int)($this->result($countSql, 0, "RowCount"));
- } else {
- $rowCount = (int)($table['TABLE_ROWS']);
- }
-
- $output .= '{"name":"' . $table['TABLE_NAME'] . '","rowcount":' . $rowCount . '},';
- }
-
- if (substr($output, -1) == ",")
- $output = substr($output, 0, -1);
-
- $output .= ']';
- }
- $output .= '},';
- }
- $output = substr($output, 0, -1);
- }
- } else if ($this->adapter == "mysql") {
- $schemaSql = $this->listDatabases();
-
- if ($this->rowCount($schemaSql)) {
- while ($schema = $this->fetchArray($schemaSql)) {
- $output .= '{"name": "' . $schema[0] . '"';
-
- $this->selectDB($schema[0]);
- $tableSql = $this->listTables();
-
- if ($this->rowCount($tableSql)) {
- $output .= ',"items": [';
- while ($table = $this->fetchArray($tableSql)) {
- $countSql = $this->query("SELECT COUNT(*) AS `RowCount` FROM `" . $table[0] . "`");
- $rowCount = (int)($this->result($countSql, 0, "RowCount"));
- $output .= '{"name":"' . $table[0] . '","rowcount":' . $rowCount . '},';
- }
-
- if (substr($output, -1) == ",")
- $output = substr($output, 0, -1);
-
- $output .= ']';
- }
- $output .= '},';
- }
- $output = substr($output, 0, -1);
- }
- } else if ($this->adapter == "sqlite") {
- $output .= '{"name": "' . $this->db . '"';
-
- $tableSql = $this->listTables();
-
- if ($tableSql) {
- $output .= ',"items": [';
- while ($tableRow = $this->fetchArray($tableSql)) {
- $countSql = $this->query("SELECT COUNT(*) AS 'RowCount' FROM '" . $tableRow[0] . "'");
- $rowCount = (int)($this->result($countSql, 0, "RowCount"));
- $output .= '{"name":"' . $tableRow[0] . '","rowcount":' . $rowCount . '},';
- }
-
- if (substr($output, -1) == ",")
- $output = substr($output, 0, -1);
-
- $output .= ']';
- }
- $output .= '}';
- }
- }
- return $output;
- }
- function error() {
- return $this->errorMessage;
- }
- }