Piotr Caban : msi: Support INSERT INTO when MSITRANSFORM_ERROR_VIEWTRANSFORM flag is used.

Alexandre Julliard julliard at winehq.org
Fri Jun 26 17:00:53 CDT 2020


Module: wine
Branch: master
Commit: 9130379710297cb487dbd8891b82f505e754c39d
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=9130379710297cb487dbd8891b82f505e754c39d

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Thu Jun 25 20:09:14 2020 +0200

msi: Support INSERT INTO when MSITRANSFORM_ERROR_VIEWTRANSFORM flag is used.

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/msi/table.c | 39 +++++++++++++++++++++++++++++++++++++--
 1 file changed, 37 insertions(+), 2 deletions(-)

diff --git a/dlls/msi/table.c b/dlls/msi/table.c
index 56d55d32cc..e6b5a09375 100644
--- a/dlls/msi/table.c
+++ b/dlls/msi/table.c
@@ -2507,7 +2507,15 @@ static UINT TransformView_add_column( MSITABLEVIEW *tv, MSIRECORD *rec )
 
 static UINT TransformView_insert_row( MSIVIEW *view, MSIRECORD *rec, UINT row, BOOL temporary )
 {
+    static const WCHAR query_fmt[] =
+        L"INSERT INTO `_TransformView` (`Table`, `Column`, `Row`) VALUES ('%s', 'INSERT', '%s')";
+
     MSITABLEVIEW *tv = (MSITABLEVIEW*)view;
+    WCHAR buf[256], *query = buf;
+    MSIQUERY *q;
+    WCHAR *key;
+    int len;
+    UINT r;
 
     if (!wcscmp(tv->name, szTables))
         return TransformView_create_table( tv, rec );
@@ -2515,8 +2523,35 @@ static UINT TransformView_insert_row( MSIVIEW *view, MSIRECORD *rec, UINT row, B
     if (!wcscmp(tv->name, szColumns))
         return TransformView_add_column( tv, rec );
 
-    FIXME("\n");
-    return ERROR_CALL_NOT_IMPLEMENTED;
+    key = create_key_string( tv, rec );
+    if (!key)
+        return ERROR_OUTOFMEMORY;
+
+    len = _snwprintf( NULL, 0, query_fmt, tv->name, key ) + 1;
+    if (len > ARRAY_SIZE(buf))
+    {
+        query = msi_alloc( len * sizeof(WCHAR) );
+        if (!query)
+        {
+            msi_free( key );
+            return ERROR_OUTOFMEMORY;
+        }
+    }
+    swprintf( query, len, query_fmt, tv->name, key );
+    msi_free( key );
+
+    r = MSI_DatabaseOpenViewW( tv->db, query, &q );
+    if (query != buf)
+        msi_free( query );
+    if (r != ERROR_SUCCESS)
+        return r;
+
+    r = MSI_ViewExecute( q, NULL );
+    msiobj_release( &q->hdr );
+    if (r != ERROR_SUCCESS)
+        return r;
+
+    return TransformView_set_row( view, row, rec, ~0 );
 }
 
 static UINT TransformView_delete_row( MSIVIEW *view, UINT row )




More information about the wine-cvs mailing list