. * * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗ * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝ * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝ * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗ * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗ * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝ */ if ( ! defined( 'ABSPATH' ) ) { die( 'Kangaroos cannot jump here' ); } class Ai1wm_Database_Sqlite extends Ai1wm_Database { /** * Get views * * @return array */ protected function get_views() { if ( is_null( $this->views ) ) { $where_query = array(); // Loop over table prefixes if ( $this->get_table_prefix_filters() ) { foreach ( $this->get_table_prefix_filters() as $prefix_filter ) { if ( isset( $prefix_filter[0], $prefix_filter[1] ) ) { $where_query[] = sprintf( "(`name` REGEXP '^%s' AND `name` NOT REGEXP '^%s')", $prefix_filter[0], $prefix_filter[1] ); } else { $where_query[] = sprintf( "`name` REGEXP '^%s'", $prefix_filter[0] ); } } } else { $where_query[] = 1; } $this->views = array(); // Loop over views $result = $this->query( sprintf( "SELECT `name` FROM `sqlite_master` WHERE `type`='view' AND (%s)", implode( ' OR ', $where_query ) ) ); while ( $row = $this->fetch_row( $result ) ) { if ( isset( $row[0] ) ) { $this->views[] = $row[0]; } } $this->free_result( $result ); } return $this->views; } /** * Get base tables * * @return array */ protected function get_base_tables() { if ( is_null( $this->base_tables ) ) { $where_query = array(); // Loop over table prefixes if ( $this->get_table_prefix_filters() ) { foreach ( $this->get_table_prefix_filters() as $prefix_filter ) { if ( isset( $prefix_filter[0], $prefix_filter[1] ) ) { $where_query[] = sprintf( "(`name` REGEXP '^%s' AND `name` NOT REGEXP '^%s')", $prefix_filter[0], $prefix_filter[1] ); } else { $where_query[] = sprintf( "`name` REGEXP '^%s'", $prefix_filter[0] ); } } } else { $where_query[] = 1; } $this->base_tables = array(); // Loop over base tables $result = $this->query( sprintf( "SELECT `name` FROM `sqlite_master` WHERE `type`='table' AND (%s)", implode( ' OR ', $where_query ) ) ); while ( $row = $this->fetch_row( $result ) ) { if ( isset( $row[0] ) ) { $this->base_tables[] = $row[0]; } } $this->free_result( $result ); } return $this->base_tables; } /** * Run SQLite query * * @param string $input SQL query * @return mixed */ public function query( $input ) { return $this->wpdb->dbh->query( $input ); } /** * Escape string input for SQLite query * * @param string $input String to escape * @return string */ public function escape( $input ) { return $this->wpdb->_real_escape( $input ); } /** * Return the error code for the most recent function call * * @return integer */ public function errno() { return 0; } /** * Return a string description of the last error * * @return string */ public function error() { } /** * Return server info * * @return string */ public function server_info() { return $this->wpdb->db_server_info(); } /** * Return result as associative array * * @param mixed $result SQLite resource * @return array */ public function fetch_assoc( &$result ) { if ( key( $result ) === null ) { return false; } $current = current( $result ); next( $result ); return get_object_vars( $current ); } /** * Return the result from SQLite query as row * * @param mixed $result SQLite resource * @return array */ public function fetch_row( &$result ) { $current = $this->fetch_assoc( $result ); if ( $current === false ) { return false; } return array_values( $current ); } /** * Return the number for rows from SQLite results * * @param mixed $result SQLite resource * @return integer */ public function num_rows( &$result ) { return count( $result ); } /** * Stub for free SQLite result memory * * @param mixed $result SQLite resource * @return void */ public function free_result( &$result ) { unset( $result ); } /** * Get SQLite create view * * @param string $table_name View name * @return string */ protected function get_create_view( $table_name ) { $result = $this->query( "SELECT `sql` FROM `sqlite_master` WHERE `name` = '{$table_name}'" ); $row = $this->fetch_assoc( $result ); // Close result cursor $this->free_result( $result ); // Get create table if ( isset( $row['sql'] ) ) { return $row['sql']; } } /** * Get SQLite create table * * @param string $table_name Table name * @return string */ protected function get_create_table( $table_name ) { $result = $this->query( "SELECT `sql` FROM `sqlite_master` WHERE `name` = '{$table_name}'" ); $row = $this->fetch_assoc( $result ); // Close result cursor $this->free_result( $result ); // Get create table if ( isset( $row['sql'] ) ) { return $row['sql']; } } /** * Replace table defaults * * @param string $input SQL statement * @return string */ protected function replace_table_defaults( $input ) { $pattern = array( '/DEFAULT(\s+)(\d+)/i', "/DEFAULT(\s+)'(.*?)'/i", ); return preg_replace( $pattern, '', $input ); } /** * Replace view quotes * * @param string $input View value * @return string */ protected function replace_view_quotes( $input ) { return str_replace( '"', '`', $input ); } /** * Replace table quotes * * @param string $input Table value * @return string */ protected function replace_table_quotes( $input ) { return str_replace( '"', '`', $input ); } /** * Get SQLite primary keys * * @param string $table_name Table name * @return array */ protected function get_primary_keys( $table_name ) { $primary_keys = array(); // Get primary keys $result = $this->query( "SELECT `table_info`.`name` FROM PRAGMA_TABLE_INFO('{$table_name}') AS table_info WHERE `table_info`.`pk` != 0" ); while ( $row = $this->fetch_assoc( $result ) ) { if ( isset( $row['name'] ) ) { $primary_keys[] = $row['name']; } } // Close result cursor $this->free_result( $result ); return $primary_keys; } /** * Get SQLite column types * * @param string $table_name Table name * @return array */ protected function get_column_types( $table_name ) { $column_types = array(); // Get column types $result = $this->query( "SELECT `name`, `type` FROM PRAGMA_TABLE_INFO('{$table_name}')" ); while ( $row = $this->fetch_assoc( $result ) ) { if ( isset( $row['name'] ) ) { $column_types[ strtolower( $row['name'] ) ] = $row['type']; } } // Close result cursor $this->free_result( $result ); return $column_types; } /** * Get SQLite column names * * @param string $table_name Table name * @return array */ public function get_column_names( $table_name ) { $column_names = array(); // Get column names $result = $this->query( "SELECT `name` FROM PRAGMA_TABLE_INFO('{$table_name}')" ); while ( $row = $this->fetch_assoc( $result ) ) { if ( isset( $row['name'] ) ) { $column_names[ strtolower( $row['name'] ) ] = $row['name']; } } // Close result cursor $this->free_result( $result ); return $column_names; } /** * Get SQLite max allowed packet * * @return integer */ protected function get_max_allowed_packet() { return PHP_INT_MAX; } /** * Use SQLite transactions * * @return bolean */ protected function use_transactions() { return false; } }