From fa6222bdeef652523b1a921b3536e7a6695e2552 Mon Sep 17 00:00:00 2001 From: Matthew Bucci Date: Mon, 30 Oct 2023 21:02:50 -0700 Subject: [PATCH 1/2] correct regex for insert matching --- pg4wp/driver_pgsql_rewrite.php | 24 ++++++++++++++++-------- readme.md | 2 ++ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/pg4wp/driver_pgsql_rewrite.php b/pg4wp/driver_pgsql_rewrite.php index 8841a6c..83fe2d6 100644 --- a/pg4wp/driver_pgsql_rewrite.php +++ b/pg4wp/driver_pgsql_rewrite.php @@ -71,18 +71,26 @@ function pg4wp_rewrite($sql) // Put back the end of the query if it was separated $sql .= $end; - // For insert ID catching + // For insert ID caching if($logto == 'INSERT') { - $pattern = '/INSERT INTO (\w+)\s+\([ a-zA-Z_"]+/'; + $pattern = '/INSERT INTO "?([\w_]+)"? \(([^)]+)\)/i'; preg_match($pattern, $sql, $matches); - $GLOBALS['pg4wp_ins_table'] = $matches[1]; - $match_list = explode(' ', $matches[0]); - if($GLOBALS['pg4wp_ins_table']) { - $GLOBALS['pg4wp_ins_field'] = trim($match_list[3], ' () '); - if(!$GLOBALS['pg4wp_ins_field']) { - $GLOBALS['pg4wp_ins_field'] = trim($match_list[4], ' () '); + + if (isset($matches[1])) { + $GLOBALS['pg4wp_ins_table'] = $matches[1]; + } + + if (isset($matches[2])) { + $columns_str = $matches[2]; + $columns = explode(',', $columns_str); + $columns = array_map(function ($column) { + return trim(trim($column), '"'); + }, $columns); + if (isset($columns[0])) { + $GLOBALS['pg4wp_ins_field'] = $columns[0]; } } + $GLOBALS['pg4wp_last_insert'] = $sql; } elseif(isset($GLOBALS['pg4wp_queued_query'])) { pg_query($GLOBALS['pg4wp_queued_query']); diff --git a/readme.md b/readme.md index 9ef1f7c..0f99a17 100644 --- a/readme.md +++ b/readme.md @@ -42,6 +42,8 @@ PG4WP 2.0 will have a mechanism to add plugin support. | Theme | Version | Working | | ----------- | ----------- | --------- | | Twenty Twenty-Three | 1.2 | Confirmed | +| Twenty Twenty-Two | 1.5 | Confirmed | +| Twenty Twenty-One | 1.9 | Confirmed | ### Installation From ae2cbff59b56a050a546e2c5bed281b00092c8f3 Mon Sep 17 00:00:00 2001 From: Matthew Bucci Date: Mon, 30 Oct 2023 21:32:25 -0700 Subject: [PATCH 2/2] add test for verifying parsing of insert statements and caching --- tests/parseTest.php | 44 ++++++++++++++++++++++++++++++++ tests/verifyAgainstStubsTest.php | 10 ++++++++ 2 files changed, 54 insertions(+) create mode 100644 tests/parseTest.php diff --git a/tests/parseTest.php b/tests/parseTest.php new file mode 100644 index 0000000..128e65d --- /dev/null +++ b/tests/parseTest.php @@ -0,0 +1,44 @@ +assertSame($GLOBALS['pg4wp_ins_table'], "wp_options"); + $this->assertSame($GLOBALS['pg4wp_ins_field'], "option_name"); + } + + + public function test_it_can_parse_a_page_creation_correctly() + { + + $sql = 'INSERT INTO wp_posts (post_author, post_date, post_date_gmt, post_content, post_content_filtered, post_title, post_excerpt, post_status, post_type, comment_status, ping_status, post_password, post_name, to_ping, pinged, post_modified, post_modified_gmt, post_parent, menu_order, post_mime_type, guid) VALUES (\'1\', \'2023-10-31 03:54:02\', now() AT TIME ZONE \'gmt\', \'\', \'\', \'Auto Draft\', \'\', \'auto-draft\', \'page\', \'closed\', \'closed\', \'\', \'\', \'\', \'\', \'2023-10-31 03:54:02\', now() AT TIME ZONE \'gmt\', 0, 0, \'\', \'\')'; + $postgresql = pg4wp_rewrite($sql); + $this->assertSame($GLOBALS['pg4wp_ins_table'], "wp_posts"); + $this->assertSame($GLOBALS['pg4wp_ins_field'], "post_author"); + } + + + protected function setUp(): void + { + global $wpdb; + $wpdb = new class() { + public $options = "wp_options"; + public $categories = "wp_categories"; + }; + } + +} \ No newline at end of file diff --git a/tests/verifyAgainstStubsTest.php b/tests/verifyAgainstStubsTest.php index 3b21b5d..1a568c8 100644 --- a/tests/verifyAgainstStubsTest.php +++ b/tests/verifyAgainstStubsTest.php @@ -22,6 +22,16 @@ final class verifyAgainstStubsTest extends TestCase $data = json_decode(file_get_contents(self::STUBS_DIRECTORY . "/" . $file), true); $this->assertSame(pg4wp_rewrite($data['mysql']), $data['postgresql']); } + } + protected function setUp(): void + { + global $wpdb; + $wpdb = new class() { + public $categories = "wp_categories"; + public $comments = "wp_comments"; + public $prefix = "wp_"; + public $options = "wp_options"; + }; } } \ No newline at end of file