From 1814fe8f840b6ba8ee99bb0dc8216fef42c5f063 Mon Sep 17 00:00:00 2001
From: Kazuhiko SHIOZAKI <kazuhiko@nexedi.com>
Date: Mon, 10 Oct 2022 09:59:38 +0200
Subject: [PATCH] py2/py3: use hexdigest instead of digest in inventory cache
 key to avoid non-valid UTF-8 bytes.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

One problem with hexdigest is that it's longer and the column was
created as binary(16). We don't have a mechanism to run migrations on
this table, so we use UNHEX in SQL to have the equivalent as digest()
from hexdigest()

Co-authored-by: Jérome Perrin <jerome@nexedi.com>
---
 .../erp5_stock_cache/Resource_zGetInventoryCacheResult.sql   | 2 +-
 .../Resource_zInsertInventoryCacheResult.sql                 | 2 +-
 .../portal_components/tool.erp5.SimulationTool.py            | 5 +++--
 3 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/bt5/erp5_stock_cache/SkinTemplateItem/portal_skins/erp5_stock_cache/Resource_zGetInventoryCacheResult.sql b/bt5/erp5_stock_cache/SkinTemplateItem/portal_skins/erp5_stock_cache/Resource_zGetInventoryCacheResult.sql
index 472952fdf5..12ac1eeb73 100644
--- a/bt5/erp5_stock_cache/SkinTemplateItem/portal_skins/erp5_stock_cache/Resource_zGetInventoryCacheResult.sql
+++ b/bt5/erp5_stock_cache/SkinTemplateItem/portal_skins/erp5_stock_cache/Resource_zGetInventoryCacheResult.sql
@@ -4,7 +4,7 @@ SELECT
 FROM 
   inventory_cache 
 WHERE 
-  inventory_cache.query=<dtml-sqlvar query type="string"> 
+  inventory_cache.query = UNHEX(<dtml-sqlvar query type="string">)
 <dtml-if date>
   AND 
   inventory_cache.date <= <dtml-sqlvar date type="datetime">
diff --git a/bt5/erp5_stock_cache/SkinTemplateItem/portal_skins/erp5_stock_cache/Resource_zInsertInventoryCacheResult.sql b/bt5/erp5_stock_cache/SkinTemplateItem/portal_skins/erp5_stock_cache/Resource_zInsertInventoryCacheResult.sql
index 896340a4a4..cc3c4db46f 100644
--- a/bt5/erp5_stock_cache/SkinTemplateItem/portal_skins/erp5_stock_cache/Resource_zInsertInventoryCacheResult.sql
+++ b/bt5/erp5_stock_cache/SkinTemplateItem/portal_skins/erp5_stock_cache/Resource_zInsertInventoryCacheResult.sql
@@ -1 +1 @@
-Insert into inventory_cache(`query`, `date`, `result`) values (<dtml-sqlvar query type="string">, <dtml-sqlvar date type="datetime">, <dtml-sqlvar result type="string">)
\ No newline at end of file
+Insert into inventory_cache(`query`, `date`, `result`) values (UNHEX(<dtml-sqlvar query type="string">), <dtml-sqlvar date type="datetime">, <dtml-sqlvar result type="string">)
\ No newline at end of file
diff --git a/product/ERP5/bootstrap/erp5_core/ToolComponentTemplateItem/portal_components/tool.erp5.SimulationTool.py b/product/ERP5/bootstrap/erp5_core/ToolComponentTemplateItem/portal_components/tool.erp5.SimulationTool.py
index 9c5add27b0..ee689bca05 100644
--- a/product/ERP5/bootstrap/erp5_core/ToolComponentTemplateItem/portal_components/tool.erp5.SimulationTool.py
+++ b/product/ERP5/bootstrap/erp5_core/ToolComponentTemplateItem/portal_components/tool.erp5.SimulationTool.py
@@ -37,6 +37,7 @@ from Products.ERP5Type.Globals import InitializeClass
 from Products.ERP5Type import Permissions
 from Products.ERP5Type.Tool.BaseTool import BaseTool
 from Products.ERP5Type.UnrestrictedMethod import UnrestrictedMethod
+from Products.ERP5Type.Utils import str2bytes
 
 from zLOG import LOG, PROBLEM, WARNING, INFO
 
@@ -1411,10 +1412,10 @@ class SimulationTool(BaseTool):
     if src__:
       sql_source_list = []
     # Generate the cache key (md5 of query source)
-    sql_text_hash = md5(Resource_zGetInventoryList(
+    sql_text_hash = md5(str2bytes(Resource_zGetInventoryList(
       stock_table_id=stock_table_id,
       src__=1,
-      **kw)).digest()
+      **kw))).hexdigest()
     # Try to get result from cache
     Resource_zGetInventoryCacheResult = self.Resource_zGetInventoryCacheResult
     inventory_cache_kw = {'query': sql_text_hash}
-- 
2.30.9