Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions src/providers/mysql/wordpress-mysql-provider.ts
Original file line number Diff line number Diff line change
@@ -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<boolean> {
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<DatabaseEngine | undefined> {
return this.engine
},
}
4 changes: 3 additions & 1 deletion src/services/messenger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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[] = [];

Expand All @@ -15,6 +16,7 @@ const providers: DatabaseEngineProvider[] = [
ConfigFileProvider,
LaravelMysqlProvider,
LaravelPostgresProvider,
WordPressMysqlProvider,
]

let database: DatabaseEngine | null = null;
Expand Down Expand Up @@ -184,4 +186,4 @@ export function getWorkspaceTables() {

export function tableExists(tableName: string) {
return workspaceTables.includes(tableName)
}
}
35 changes: 35 additions & 0 deletions src/services/wordpress/env-file-parser.ts
Original file line number Diff line number Diff line change
@@ -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<Sequelize | undefined> {
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<Sequelize | undefined> {
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<number | undefined> {
return parseInt(await getConfigFileValue('DB_PORT') || '3306')
}
17 changes: 17 additions & 0 deletions src/services/wordpress/wordpress-core.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { fileExists, getWorkspaceFileContent } from "../workspace";

export async function getConfigFileValue(envFileKey: string): Promise<string | undefined> {
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
}