Skip to content

add support for WordPress #39

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
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
}