Hans Leidekker : msi: Support updating streams.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Mar 4 09:22:17 CST 2015
Module: wine
Branch: master
Commit: 123428942d773454b4d388aabdca0caae939e79c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=123428942d773454b4d388aabdca0caae939e79c
Author: Hans Leidekker <hans at codeweavers.com>
Date: Wed Mar 4 14:30:08 2015 +0100
msi: Support updating streams.
---
dlls/msi/table.c | 54 +++++++++++++++++++++++++++++++++++++++---------------
1 file changed, 39 insertions(+), 15 deletions(-)
diff --git a/dlls/msi/table.c b/dlls/msi/table.c
index cfe5612..e1f7d9b 100644
--- a/dlls/msi/table.c
+++ b/dlls/msi/table.c
@@ -1054,7 +1054,7 @@ static UINT TABLE_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT *
return ERROR_SUCCESS;
}
-static UINT msi_stream_name( const MSITABLEVIEW *tv, UINT row, LPWSTR *pstname )
+static UINT get_stream_name( const MSITABLEVIEW *tv, UINT row, WCHAR **pstname )
{
LPWSTR p, stname = NULL;
UINT i, r, type, ival;
@@ -1154,7 +1154,7 @@ static UINT TABLE_fetch_stream( struct tagMSIVIEW *view, UINT row, UINT col, ISt
if( !view->ops->fetch_int )
return ERROR_INVALID_PARAMETER;
- r = msi_stream_name( tv, row, &name );
+ r = get_stream_name( tv, row, &name );
if (r != ERROR_SUCCESS)
{
ERR("fetching stream, error = %u\n", r);
@@ -1216,39 +1216,63 @@ static UINT TABLE_get_row( struct tagMSIVIEW *view, UINT row, MSIRECORD **rec )
return msi_view_get_row(tv->db, view, row, rec);
}
-static UINT msi_addstreamW( MSIDATABASE *db, LPCWSTR name, IStream *data )
+static UINT add_stream( MSIDATABASE *db, const WCHAR *name, IStream *data )
{
static const WCHAR insert[] = {
'I','N','S','E','R','T',' ','I','N','T','O',' ',
'`','_','S','t','r','e','a','m','s','`',' ',
'(','`','N','a','m','e','`',',','`','D','a','t','a','`',')',' ',
'V','A','L','U','E','S',' ','(','?',',','?',')',0};
- MSIQUERY *query = NULL;
+ static const WCHAR update[] = {
+ 'U','P','D','A','T','E',' ','`','_','S','t','r','e','a','m','s','`',' ',
+ 'S','E','T',' ','`','D','a','t','a','`',' ','=',' ','?',' ',
+ 'W','H','E','R','E',' ','`','N','a','m','e','`',' ','=',' ','?',0};
+ MSIQUERY *query;
MSIRECORD *rec;
UINT r;
TRACE("%p %s %p\n", db, debugstr_w(name), data);
- rec = MSI_CreateRecord( 2 );
- if ( !rec )
+ if (!(rec = MSI_CreateRecord( 2 )))
return ERROR_OUTOFMEMORY;
r = MSI_RecordSetStringW( rec, 1, name );
- if ( r != ERROR_SUCCESS )
- goto err;
+ if (r != ERROR_SUCCESS)
+ goto done;
r = MSI_RecordSetIStream( rec, 2, data );
- if ( r != ERROR_SUCCESS )
- goto err;
+ if (r != ERROR_SUCCESS)
+ goto done;
r = MSI_DatabaseOpenViewW( db, insert, &query );
- if ( r != ERROR_SUCCESS )
- goto err;
+ if (r != ERROR_SUCCESS)
+ goto done;
r = MSI_ViewExecute( query, rec );
+ msiobj_release( &query->hdr );
+ if (r == ERROR_SUCCESS)
+ goto done;
-err:
+ msiobj_release( &rec->hdr );
+ if (!(rec = MSI_CreateRecord( 2 )))
+ return ERROR_OUTOFMEMORY;
+
+ r = MSI_RecordSetIStream( rec, 1, data );
+ if (r != ERROR_SUCCESS)
+ goto done;
+
+ r = MSI_RecordSetStringW( rec, 2, name );
+ if (r != ERROR_SUCCESS)
+ goto done;
+
+ r = MSI_DatabaseOpenViewW( db, update, &query );
+ if (r != ERROR_SUCCESS)
+ goto done;
+
+ r = MSI_ViewExecute( query, rec );
msiobj_release( &query->hdr );
+
+done:
msiobj_release( &rec->hdr );
return r;
}
@@ -1345,14 +1369,14 @@ static UINT TABLE_set_row( struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, UI
if ( r != ERROR_SUCCESS )
return r;
- r = msi_stream_name( tv, row, &stname );
+ r = get_stream_name( tv, row, &stname );
if ( r != ERROR_SUCCESS )
{
IStream_Release( stm );
return r;
}
- r = msi_addstreamW( tv->db, stname, stm );
+ r = add_stream( tv->db, stname, stm );
IStream_Release( stm );
msi_free ( stname );
More information about the wine-cvs
mailing list