diff --git a/src/providers/mysql/wordpress-mysql-provider.ts b/src/providers/mysql/wordpress-mysql-provider.ts new file mode 100644 index 0000000..bc35c22 --- /dev/null +++ b/src/providers/mysql/wordpress-mysql-provider.ts @@ -0,0 +1,30 @@ +import * as vscode from 'vscode' +import { DatabaseEngine, DatabaseEngineProvider } from '../../types' +import { MysqlEngine } from '../../database-engines/mysql-engine' +import { getConnectionInEnvFile } from '../../services/wordpress/env-file-parser' + +export const WordPressMysqlProvider: DatabaseEngineProvider = { + name: 'WordPress Mysql', + type: 'mysql', + id: 'wordpress-mysql', + description: 'WordPress MySQL with default wp-config.php or wp-config-local.php file', + engine: undefined, + + async canBeUsedInCurrentWorkspace(): Promise { + const connection = await getConnectionInEnvFile('mysql', 'mysql') + if (!connection) return false + + try { + this.engine = new MysqlEngine(connection) + } catch (error) { + vscode.window.showErrorMessage(`MySQL connection error: ${String(error)}`) + return false + } + + return (await this.engine.getTables()).length > 0 + }, + + async getDatabaseEngine(): Promise { + return this.engine + }, +} diff --git a/src/services/messenger.ts b/src/services/messenger.ts index a6eb043..098914c 100644 --- a/src/services/messenger.ts +++ b/src/services/messenger.ts @@ -6,6 +6,7 @@ import { ConfigFileProvider } from '../providers/config-file-provider'; import { LaravelMysqlProvider } from '../providers/mysql/laravel-mysql-provider'; import { getPaginationFor } from './pagination'; import { LaravelPostgresProvider } from '../providers/postgres/laravel-postgres-provider'; +import { WordPressMysqlProvider } from '../providers/mysql/wordpress-mysql-provider' const workspaceTables: string[] = []; @@ -15,6 +16,7 @@ const providers: DatabaseEngineProvider[] = [ ConfigFileProvider, LaravelMysqlProvider, LaravelPostgresProvider, + WordPressMysqlProvider, ] let database: DatabaseEngine | null = null; @@ -184,4 +186,4 @@ export function getWorkspaceTables() { export function tableExists(tableName: string) { return workspaceTables.includes(tableName) -} \ No newline at end of file +} diff --git a/src/services/wordpress/env-file-parser.ts b/src/services/wordpress/env-file-parser.ts new file mode 100644 index 0000000..d6034b0 --- /dev/null +++ b/src/services/wordpress/env-file-parser.ts @@ -0,0 +1,35 @@ +import * as vscode from 'vscode'; +import { getConfigFileValue } from "./wordpress-core"; +import { Dialect, Sequelize } from "sequelize"; +import { getConnectionFor } from "../sequelize-connector"; +import { LaravelConnection } from '../../types'; + +export async function getConnectionInEnvFile(connection: LaravelConnection, dialect: Dialect): Promise { + const host = await getHost() + const username = await getConfigFileValue('DB_USER') || '' + const password = await getConfigFileValue('DB_PASSWORD') || '' + const database = await getConfigFileValue('DB_NAME') + let port = await getPort() + + if (!database || !port) return + + try { + return await connectUsingHostConfiguredInEnvFile(dialect, host, port, username, password, database) + } catch (error) { + return + } +} + +async function connectUsingHostConfiguredInEnvFile(dialect: Dialect, host: string, port: number, username: string, password: string, database: string): Promise { + return await getConnectionFor(dialect, host, port, username, password, database) +} + +async function getHost() { + const localhost = '127.0.0.1' + + return (await getConfigFileValue('DB_HOST')) || localhost +} + +async function getPort(): Promise { + return parseInt(await getConfigFileValue('DB_PORT') || '3306') +} diff --git a/src/services/wordpress/wordpress-core.ts b/src/services/wordpress/wordpress-core.ts new file mode 100644 index 0000000..070a1ec --- /dev/null +++ b/src/services/wordpress/wordpress-core.ts @@ -0,0 +1,17 @@ +import { fileExists, getWorkspaceFileContent } from "../workspace"; + +export async function getConfigFileValue(envFileKey: string): Promise { + const filename = (await fileExists('wp-config-local.php')) ? 'wp-config-local.php' : 'wp-config.php' + + const envFileContents = getWorkspaceFileContent(filename)?.toString() + if (!envFileContents) return + + const lines = envFileContents.split('\n'); + const configLine = lines.find(line => line.includes(`${envFileKey}=`)) + if (!configLine) return + + const regex = new RegExp(envFileKey + '[\'", ]+(.+)[\'"]', 'g') + const value = configLine.match(regex)?.[0] + + return value +}