wpdb = $wpdb; } /** * Get all tables with the WordPress table prefix. * * @return array List of table names. * @throws DBException */ public function listTables(): array { try { $like_pattern = $this->wpdb->esc_like($this->getPrefix()) . '%'; $tables = $this->query("SHOW TABLES LIKE %s", [$like_pattern], ARRAY_N); $tableList = []; foreach ($tables as $table) { $tableList[] = $table[0]; } return $tableList; } catch (Exception $e) { throw new DBException($e->getMessage()); } } /** * @return string|null * Check if the current database user has the required privileges to restore the database. */ public function checkPrivileges(): ?string { try { $this->execRaw("CREATE TEMPORARY TABLE jetbackup_priv_test (id INT);"); $this->execRaw("DROP TEMPORARY TABLE jetbackup_priv_test;"); return null; } catch (Exception $e) { return 'Database permissions error: ' . $e->getMessage(); } } /** * Get the WordPress table prefix. * * @return string Table prefix. */ public function getPrefix(): string { return $this->wpdb->prefix; } /** * Execute a query and return the results. * * @param string $query SQL query string. * @param array $params Parameters for SQL query. * @param string $resultType Type of result (OBJECT, ARRAY_A, ARRAY_N). * * @throws DBException */ public function query(string $query, array $params = [], string $resultType = OBJECT) { try { if (!empty($params)) { $query = $this->wpdb->prepare($query, $params); } return $this->wpdb->get_results($query, $resultType); } catch (Exception $e) { throw new DBException($e->getMessage()); } } /** * Execute an SQL query and return the number of rows affected. * * @param string $query SQL query string. * * @return int Number of rows affected. * @throws DBException */ public function exec( string $query): int { try { return $this->wpdb->query($this->escapeSql($query)); } catch (Exception $e) { throw new DBException ($e->getMessage()); } } /** * Execute a raw SQL query without preparation. * * @param string $query Raw SQL query string. * * @throws DBException */ public function execRaw( string $query) { try { return $this->wpdb->get_results($this->escapeSql($query)); } catch (Exception $e) { throw new DBException ($e->getMessage()); } } /** * Fetch a single row from the result set. * * @param string $query SQL query string. * @param array $params Parameters for SQL query. * @param string $resultType Type of result (OBJECT, ARRAY_A, ARRAY_N). * * @throws DBException */ public function fetch( string $query, array $params = [], string $resultType = OBJECT) { try { $preparedQuery = $this->wpdb->prepare($query, $params); return $this->wpdb->get_row($preparedQuery, $resultType); } catch (Exception $e) { throw new DBException ($e->getMessage()); } } /** * Get the ID of the last inserted row. * * @return int Last insert ID. */ public function lastInsertId(): int { return $this->wpdb->insert_id; } /** * Get the last error occurred in database operations. * * @return string Last error message. */ public function getLastError(): string { return $this->wpdb->last_error; } /** * Flush the cached results. */ public function flush() { $this->wpdb->flush(); } /** * Escape a SQL string for safe use in queries. * * @param mixed $value The value to be escaped. * @return array|string The escaped value. */ public function escapeSql($value) { if (function_exists('esc_sql')) { return esc_sql($value); } else { return $this->wpdb->_escape($value); } } /** * Clears all post revisions from the WordPress database. * * @return int The number of rows affected. * @throws DBException */ public function clearPostRevisions(): int { try { $query = "DELETE FROM {$this->wpdb->posts} WHERE post_type = %s"; return $this->exec($this->wpdb->prepare($query, ['revision'])); } catch (Exception $e) { throw new DBException($e->getMessage()); } } }