Problem/Motivation

Hi,

I am trying to update from commerce_stripe 8.x-1.1 to 8.x-1.2 and I got the following fatal error on commerce_stripe_update_8103 update:

[notice] Update started: commerce_stripe_update_8103
>  [error]  SQLSTATE[42S22]: Column not found: 1054 Unknown column 'commerce_payment_method__card_exp_month.entity_id' in 'WHERE': DELETE FROM "PREFIX_commerce_payment_method__card_exp_month" WHERE bundle = 'credit_card' and EXISTS (SELECT * FROM "PREFIX_commerce_payment_method" WHERE commerce_payment_method__card_exp_month.entity_id = commerce_payment_method.method_id and commerce_payment_method.type = 'stripe_card'); Array

I changed my actual database prefix by PREFIX in the copy/pasted error.

I think direct database queries like:

      $database->query("INSERT INTO {commerce_payment_method__stripe_card_exp_month} SELECT * FROM {commerce_payment_method__card_exp_month} cem WHERE cem.bundle = 'credit_card' and EXISTS (SELECT * FROM {commerce_payment_method} pm WHERE cem.entity_id = pm.method_id and pm.type = 'stripe_card') and NOT EXISTS (SELECT * FROM {commerce_payment_method__stripe_card_exp_month} scem2 WHERE cem.entity_id = scem2.entity_id);");

do not handle database prefix.

Steps to reproduce

Install commerce_stripe 8.x-1.1 on a website with a database prefix. Update to 8.x-1.2.

Proposed resolution

Rewrite the update code to use database insert/update/delete methods with abstraction layer.

Remaining tasks

CommentFileSizeAuthor
#6 commerce_stripe-3502405-6.patch5.21 KBgrimreaper
Command icon Show commands

Start within a Git clone of the project using the version control instructions.

Or, if you do not have SSH keys set up on git.drupalcode.org:

Comments

grimreaper created an issue. See original summary.

nidhish’s picture

Assigned: Unassigned » nidhish
grimreaper’s picture

Assigned: nidhish » grimreaper

grimreaper’s picture

Version: 8.x-1.2 » 8.x-1.x-dev
Assigned: grimreaper » Unassigned
Status: Active » Needs review

Subqueries did not get the replacement {} mechanism.

grimreaper’s picture

StatusFileSize
new5.21 KB

Patch for Composer usage.

joe huggans’s picture

@grimreaper I just noticed myself earlier that it's possible to get a diff file by clicking on "Plain diff" on the MR, handy feature if it works.

I've tested this on a new install with a database prefix and was not able to replicate the error with commerce_stripe_update_8103, not sure why.

However, I tested the patch and tried to db update again and it went through successfully.

grimreaper’s picture

@joe huggans, thanks for the feedbacks.

Thanks, I know the diff or patch file from a Gitlab URL. The problem is that the content of this URL will change if the MR is changed, so I need something stable to rely on. And I don't want to commit the patch file locally on my project, in case other projects needs it. So until Gitlab provide the feature to be able to pass the commit ID for the diff in the MR, I will upload patch files (generated from the MR).

Before running the update 8103, have you ensured that you had payment gateways that will match the conditions at the beginning of the udpate hook?

On your fresh install, are you starting from commerce_stripe 8.x-1.1, setup payment gateways, then update to 8.x-1.2?

joe huggans’s picture

Ahh understood yes, thanks. That would be a nice feature to pass the commit ID for the diff though.

I had Stripe Payment Element enabled previously for the payment gateway plugin, it looks like I should have tested with Stripe Card Element?

However, I'm having issues creating such a payment gateway, seeing this error -

An AJAX HTTP error occurred.
HTTP Result Code: 500
Debugging information follows.
Path: /admin/commerce/config/payment-gateways/add?ajax_form=1
StatusText: error
ResponseText: The website encountered an unexpected error. Try again later.TypeError: array_map(): Argument #2 ($array) must be of type array, null given in array_map() (line 303 of modules/contrib/commerce/modules/payment/src/Plugin/Commerce/PaymentGateway/PaymentGatewayBase.php). Drupal\commerce_payment\Plugin\Commerce\PaymentGateway\PaymentGatewayBase->buildConfigurationForm() (Line: 16)
Drupal\commerce_payment\Plugin\Commerce\PaymentGateway\OnsitePaymentGatewayBase->buildConfigurationForm() (Line: 170)
Drupal\commerce_stripe\Plugin\Commerce\PaymentGateway\Stripe->buildConfigurationForm() (Line: 105)
Drupal\commerce\Plugin\Commerce\InlineForm\PluginConfiguration->buildInlineForm() (Line: 130)
Drupal\commerce_payment\Form\PaymentGatewayForm->form() (Line: 107)
Drupal\Core\Entity\EntityForm->buildForm() (Line: 66)
Drupal\commerce_payment\Form\PaymentGatewayForm->buildForm()
call_user_func_array() (Line: 536)
Drupal\Core\Form\FormBuilder->retrieveForm() (Line: 375)
Drupal\Core\Form\FormBuilder->rebuildForm() (Line: 633)
Drupal\Core\Form\FormBuilder->processForm() (Line: 326)
Drupal\Core\Form\FormBuilder->buildForm() (Line: 73)
Drupal\Core\Controller\FormController->getContentResult()
call_user_func_array() (Line: 123)
Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}() (Line: 638)
Drupal\Core\Render\Renderer->executeInRenderContext() (Line: 121)
Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->wrapControllerExecutionInRenderContext() (Line: 97)
Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}() (Line: 181)
Symfony\Component\HttpKernel\HttpKernel->handleRaw() (Line: 76)
Symfony\Component\HttpKernel\HttpKernel->handle() (Line: 53)
Drupal\Core\StackMiddleware\Session->handle() (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle() (Line: 28)
Drupal\Core\StackMiddleware\ContentLength->handle() (Line: 32)
Drupal\big_pipe\StackMiddleware\ContentLength->handle() (Line: 116)
Drupal\page_cache\StackMiddleware\PageCache->pass() (Line: 90)
Drupal\page_cache\StackMiddleware\PageCache->handle() (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle() (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle() (Line: 36)
Drupal\Core\StackMiddleware\AjaxPageState->handle() (Line: 51)
Drupal\Core\StackMiddleware\StackedHttpKernel->handle() (Line: 741)
Drupal\Core\DrupalKernel->handle() (Line: 19)

grimreaper’s picture

I had "plugin: stripe_payment_element" too. But in "payment_method_types:" I had "credit_card".

I don't know where this other issue comes from. I am not on a project with stripe or commerce to try to reproduce right now.

joe huggans’s picture

I'm just trying to help out with testing.

But I can't replicate the issue, credit_card seems to be the default for the Stripe Payment Element plugin and it isn't causing an error on the update 8103.

Hopefully someone else can confirm, sorry

grimreaper’s picture

I'm just trying to help out with testing.

No worries and huge thanks for that! :)

tomtech’s picture

@grimreaper,

Thanks for the report!

Took a minute to setup to circle on this one, as it has been a while since I've used a prefix. :)

Direct DB queries do support prefix substitution.

It wasn't possible to write this query using the abstraction layer, because of the subqueries.

As observed in your MR, the table names were properly wrapped with curly braces to handle prefix substitution, but for the subquery joins, the table.column needed to also be wrapped as {table}.column. (When using an alias, this isn't necessary, but for some SQL statements, aliases can't be used. For those, the full table name must be used.)

I've reproduced the issue, and the proposed MR resolves it.

Merging.

Thanks!

  • tomtech committed 69f9eef5 on 8.x-1.x authored by grimreaper
    Issue #3502405 by grimreaper, tomtech: commerce_stripe_update_8103 does...
tomtech’s picture

tomtech’s picture

Status: Needs review » Fixed

  • tomtech committed 69f9eef5 on 2.0.x authored by grimreaper
    Issue #3502405 by grimreaper, tomtech: commerce_stripe_update_8103 does...

Status: Fixed » Closed (fixed)

Automatically closed - issue fixed for 2 weeks with no activity.