Module: wine Branch: master Commit: 71d8f4ebf6bfab3450f914408ed89144f56d19a2 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=71d8f4ebf6bfab3450f91440...
Author: Mike McCormack mike@codeweavers.com Date: Thu Aug 31 17:05:45 2006 +0900
msi: Create a function to copy record fields, use it to order INSERT fields correctly.
---
dlls/msi/insert.c | 6 +----- dlls/msi/msipriv.h | 1 + dlls/msi/record.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++- dlls/msi/select.c | 27 ++++++++++++++++++++++++--- 4 files changed, 73 insertions(+), 9 deletions(-)
diff --git a/dlls/msi/insert.c b/dlls/msi/insert.c index 85c9f51..eb65904 100644 --- a/dlls/msi/insert.c +++ b/dlls/msi/insert.c @@ -66,7 +66,6 @@ static MSIRECORD *INSERT_merge_record( U { MSIRECORD *merged; DWORD wildcard_count = 1, i; - const WCHAR *str;
merged = MSI_CreateRecord( fields ); for( i=1; i <= fields; i++ ) @@ -88,10 +87,7 @@ static MSIRECORD *INSERT_merge_record( U case EXPR_WILDCARD: if( !rec ) goto err; - if( MSI_RecordIsNull( rec, wildcard_count ) ) - goto err; - str = MSI_RecordGetString( rec, wildcard_count ); - MSI_RecordSetStringW( merged, i, str ); + MSI_RecordCopyField( rec, wildcard_count, merged, i ); wildcard_count++; break; default: diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h index 991c11c..191c770 100644 --- a/dlls/msi/msipriv.h +++ b/dlls/msi/msipriv.h @@ -371,6 +371,7 @@ extern UINT MSI_RecordSetStreamW( MSIREC extern UINT MSI_RecordSetStreamA( MSIRECORD *, unsigned int, LPCSTR ); extern UINT MSI_RecordDataSize( MSIRECORD *, unsigned int ); extern UINT MSI_RecordStreamToFile( MSIRECORD *, unsigned int, LPCWSTR ); +extern UINT MSI_RecordCopyField( MSIRECORD *, unsigned int, MSIRECORD *, unsigned int );
/* stream internals */ extern UINT get_raw_stream( MSIHANDLE hdb, LPCWSTR stname, IStream **stm ); diff --git a/dlls/msi/record.c b/dlls/msi/record.c index 6c9a567..8bc3871 100644 --- a/dlls/msi/record.c +++ b/dlls/msi/record.c @@ -43,7 +43,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(msidb);
#define MSIFIELD_NULL 0 #define MSIFIELD_INT 1 -#define MSIFIELD_STR 2 #define MSIFIELD_WSTR 3 #define MSIFIELD_STREAM 4
@@ -154,6 +153,53 @@ static BOOL string2intW( LPCWSTR str, in return TRUE; }
+UINT MSI_RecordCopyField( MSIRECORD *in_rec, unsigned int in_n, + MSIRECORD *out_rec, unsigned int out_n ) +{ + UINT r = ERROR_SUCCESS; + + msiobj_lock( &in_rec->hdr ); + + if ( in_n > in_rec->count || out_n > out_rec->count ) + r = ERROR_FUNCTION_FAILED; + else if ( in_rec != out_rec || in_n != out_n ) + { + LPWSTR str; + MSIFIELD *in, *out; + + in = &in_rec->fields[in_n]; + out = &out_rec->fields[out_n]; + + switch ( in->type ) + { + case MSIFIELD_NULL: + break; + case MSIFIELD_INT: + out->u.iVal = in->u.iVal; + break; + case MSIFIELD_WSTR: + str = strdupW( in->u.szwVal ); + if ( !str ) + r = ERROR_OUTOFMEMORY; + else + out->u.szwVal = str; + break; + case MSIFIELD_STREAM: + IStream_AddRef( in->u.stream ); + out->u.stream = in->u.stream; + break; + default: + ERR("invalid field type %d\n", in->type); + } + if (r == ERROR_SUCCESS) + out->type = in->type; + } + + msiobj_unlock( &in_rec->hdr ); + + return r; +} + int MSI_RecordGetInteger( MSIRECORD *rec, unsigned int iField) { int ret = 0; diff --git a/dlls/msi/select.c b/dlls/msi/select.c index abb2dbd..d47792b 100644 --- a/dlls/msi/select.c +++ b/dlls/msi/select.c @@ -102,13 +102,34 @@ static UINT SELECT_set_int( struct tagMS static UINT SELECT_insert_row( struct tagMSIVIEW *view, MSIRECORD *record ) { MSISELECTVIEW *sv = (MSISELECTVIEW*)view; + UINT i, table_cols, r; + MSIRECORD *outrec;
TRACE("%p %p\n", sv, record );
- if( !sv->table ) - return ERROR_FUNCTION_FAILED; + if ( !sv->table ) + return ERROR_FUNCTION_FAILED; + + /* rearrange the record to suit the table */ + r = sv->table->ops->get_dimensions( sv->table, NULL, &table_cols ); + if (r != ERROR_SUCCESS) + return r; + + outrec = MSI_CreateRecord( table_cols + 1 );
- return sv->table->ops->insert_row( sv->table, record ); + for (i=0; i<sv->num_cols; i++) + { + r = MSI_RecordCopyField( record, i+1, outrec, sv->cols[i] ); + if (r != ERROR_SUCCESS) + goto fail; + } + + r = sv->table->ops->insert_row( sv->table, outrec ); + +fail: + msiobj_release( &outrec->hdr ); + + return r; }
static UINT SELECT_execute( struct tagMSIVIEW *view, MSIRECORD *record )