Hans Leidekker : msi: Get rid of the open streams cache.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Feb 13 07:55:57 CST 2015
Module: wine
Branch: master
Commit: d954fbf8da039e508e3f9516e3ef40d63fd03bfa
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d954fbf8da039e508e3f9516e3ef40d63fd03bfa
Author: Hans Leidekker <hans at codeweavers.com>
Date: Fri Feb 13 13:37:49 2015 +0100
msi: Get rid of the open streams cache.
---
dlls/msi/database.c | 150 ++--------------------------------------------------
dlls/msi/media.c | 13 ++---
dlls/msi/msipriv.h | 2 -
dlls/msi/streams.c | 4 +-
4 files changed, 11 insertions(+), 158 deletions(-)
diff --git a/dlls/msi/database.c b/dlls/msi/database.c
index e5ed16e..9749d66 100644
--- a/dlls/msi/database.c
+++ b/dlls/msi/database.c
@@ -59,116 +59,26 @@ typedef struct tagMSITRANSFORM {
IStorage *stg;
} MSITRANSFORM;
-typedef struct tagMSISTREAM {
- struct list entry;
- IStorage *stg;
- IStream *stm;
-} MSISTREAM;
-
-static UINT find_open_stream( MSIDATABASE *db, IStorage *stg, LPCWSTR name, IStream **stm )
-{
- MSISTREAM *stream;
-
- LIST_FOR_EACH_ENTRY( stream, &db->streams, MSISTREAM, entry )
- {
- HRESULT r;
- STATSTG stat;
-
- if (stream->stg != stg) continue;
-
- r = IStream_Stat( stream->stm, &stat, 0 );
- if( FAILED( r ) )
- {
- WARN("failed to stat stream r = %08x!\n", r);
- continue;
- }
-
- if( !strcmpW( name, stat.pwcsName ) )
- {
- TRACE("found %s\n", debugstr_w(name));
- *stm = stream->stm;
- CoTaskMemFree( stat.pwcsName );
- return ERROR_SUCCESS;
- }
-
- CoTaskMemFree( stat.pwcsName );
- }
-
- return ERROR_FUNCTION_FAILED;
-}
-
-UINT msi_clone_open_stream( MSIDATABASE *db, IStorage *stg, LPCWSTR name, IStream **stm )
-{
- IStream *stream;
-
- if (find_open_stream( db, stg, name, &stream ) == ERROR_SUCCESS)
- {
- HRESULT r;
- LARGE_INTEGER pos;
-
- r = IStream_Clone( stream, stm );
- if( FAILED( r ) )
- {
- WARN("failed to clone stream r = %08x!\n", r);
- return ERROR_FUNCTION_FAILED;
- }
-
- pos.QuadPart = 0;
- r = IStream_Seek( *stm, pos, STREAM_SEEK_SET, NULL );
- if( FAILED( r ) )
- {
- IStream_Release( *stm );
- return ERROR_FUNCTION_FAILED;
- }
-
- return ERROR_SUCCESS;
- }
-
- return ERROR_FUNCTION_FAILED;
-}
-
UINT msi_get_raw_stream( MSIDATABASE *db, LPCWSTR stname, IStream **stm )
{
HRESULT r;
- IStorage *stg;
WCHAR decoded[MAX_STREAM_NAME_LEN + 1];
decode_streamname( stname, decoded );
TRACE("%s -> %s\n", debugstr_w(stname), debugstr_w(decoded));
- if (msi_clone_open_stream( db, db->storage, stname, stm ) == ERROR_SUCCESS)
- return ERROR_SUCCESS;
-
- r = IStorage_OpenStream( db->storage, stname, NULL,
- STGM_READ | STGM_SHARE_EXCLUSIVE, 0, stm );
- if( FAILED( r ) )
+ r = IStorage_OpenStream( db->storage, stname, NULL, STGM_READ | STGM_SHARE_EXCLUSIVE, 0, stm );
+ if (FAILED( r ))
{
MSITRANSFORM *transform;
LIST_FOR_EACH_ENTRY( transform, &db->transforms, MSITRANSFORM, entry )
{
- r = IStorage_OpenStream( transform->stg, stname, NULL,
- STGM_READ | STGM_SHARE_EXCLUSIVE, 0, stm );
- if (SUCCEEDED(r))
- {
- stg = transform->stg;
+ r = IStorage_OpenStream( transform->stg, stname, NULL, STGM_READ | STGM_SHARE_EXCLUSIVE, 0, stm );
+ if (SUCCEEDED( r ))
break;
- }
}
}
- else stg = db->storage;
-
- if( SUCCEEDED(r) )
- {
- MSISTREAM *stream;
-
- if (!(stream = msi_alloc( sizeof(MSISTREAM) ))) return ERROR_NOT_ENOUGH_MEMORY;
- stream->stg = stg;
- IStorage_AddRef( stg );
- stream->stm = *stm;
- IStream_AddRef( *stm );
- list_add_tail( &db->streams, &stream->entry );
- }
return SUCCEEDED(r) ? ERROR_SUCCESS : ERROR_FUNCTION_FAILED;
}
@@ -177,58 +87,13 @@ static void free_transforms( MSIDATABASE *db )
{
while( !list_empty( &db->transforms ) )
{
- MSITRANSFORM *t = LIST_ENTRY( list_head( &db->transforms ),
- MSITRANSFORM, entry );
+ MSITRANSFORM *t = LIST_ENTRY( list_head( &db->transforms ), MSITRANSFORM, entry );
list_remove( &t->entry );
IStorage_Release( t->stg );
msi_free( t );
}
}
-void msi_destroy_stream( MSIDATABASE *db, const WCHAR *stname )
-{
- MSISTREAM *stream, *stream2;
-
- LIST_FOR_EACH_ENTRY_SAFE( stream, stream2, &db->streams, MSISTREAM, entry )
- {
- HRESULT r;
- STATSTG stat;
-
- r = IStream_Stat( stream->stm, &stat, 0 );
- if (FAILED(r))
- {
- WARN("failed to stat stream r = %08x\n", r);
- continue;
- }
-
- if (!strcmpW( stname, stat.pwcsName ))
- {
- TRACE("destroying %s\n", debugstr_w(stname));
-
- list_remove( &stream->entry );
- IStream_Release( stream->stm );
- IStorage_Release( stream->stg );
- IStorage_DestroyElement( stream->stg, stname );
- msi_free( stream );
- CoTaskMemFree( stat.pwcsName );
- break;
- }
- CoTaskMemFree( stat.pwcsName );
- }
-}
-
-static void free_streams( MSIDATABASE *db )
-{
- while( !list_empty( &db->streams ) )
- {
- MSISTREAM *s = LIST_ENTRY(list_head( &db->streams ), MSISTREAM, entry);
- list_remove( &s->entry );
- IStream_Release( s->stm );
- IStorage_Release( s->stg );
- msi_free( s );
- }
-}
-
void append_storage_to_db( MSIDATABASE *db, IStorage *stg )
{
MSITRANSFORM *t;
@@ -237,9 +102,6 @@ void append_storage_to_db( MSIDATABASE *db, IStorage *stg )
t->stg = stg;
IStorage_AddRef( stg );
list_add_head( &db->transforms, &t->entry );
-
- /* the transform may add or replace streams */
- free_streams( db );
}
static VOID MSI_CloseDatabase( MSIOBJECTHDR *arg )
@@ -248,7 +110,6 @@ static VOID MSI_CloseDatabase( MSIOBJECTHDR *arg )
msi_free(db->path);
free_cached_tables( db );
- free_streams( db );
free_transforms( db );
if (db->strings) msi_destroy_stringtable( db->strings );
IStorage_Release( db->storage );
@@ -431,7 +292,6 @@ UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb)
db->deletefile = strdupW( szDBPath );
list_init( &db->tables );
list_init( &db->transforms );
- list_init( &db->streams );
db->strings = msi_load_string_table( stg, &db->bytes_per_strref );
if( !db->strings )
diff --git a/dlls/msi/media.c b/dlls/msi/media.c
index c26ac41..3dbd1b7 100644
--- a/dlls/msi/media.c
+++ b/dlls/msi/media.c
@@ -227,15 +227,12 @@ static INT_PTR CDECL cabinet_open_stream( char *pszFile, int oflag, int pmode )
WARN("failed to encode stream name\n");
return -1;
}
- if (msi_clone_open_stream( package_disk.package->db, cab->storage, encoded, &stream ) != ERROR_SUCCESS)
+ hr = IStorage_OpenStream( cab->storage, encoded, NULL, STGM_READ|STGM_SHARE_EXCLUSIVE, 0, &stream );
+ if (FAILED(hr))
{
- hr = IStorage_OpenStream( cab->storage, encoded, NULL, STGM_READ|STGM_SHARE_EXCLUSIVE, 0, &stream );
- if (FAILED(hr))
- {
- WARN("failed to open stream 0x%08x\n", hr);
- msi_free( encoded );
- return -1;
- }
+ WARN("failed to open stream 0x%08x\n", hr);
+ msi_free( encoded );
+ return -1;
}
msi_free( encoded );
return (INT_PTR)stream;
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h
index 88333d3..661535f 100644
--- a/dlls/msi/msipriv.h
+++ b/dlls/msi/msipriv.h
@@ -93,7 +93,6 @@ typedef struct tagMSIDATABASE
UINT media_transform_disk_id;
struct list tables;
struct list transforms;
- struct list streams;
} MSIDATABASE;
typedef struct tagMSIVIEW MSIVIEW;
@@ -830,7 +829,6 @@ extern BOOL decode_streamname(LPCWSTR in, LPWSTR out) DECLSPEC_HIDDEN;
/* database internals */
extern UINT msi_get_raw_stream( MSIDATABASE *, LPCWSTR, IStream ** ) DECLSPEC_HIDDEN;
-extern UINT msi_clone_open_stream( MSIDATABASE *, IStorage *, const WCHAR *, IStream ** ) DECLSPEC_HIDDEN;
void msi_destroy_stream( MSIDATABASE *, const WCHAR * ) DECLSPEC_HIDDEN;
extern UINT MSI_OpenDatabaseW( LPCWSTR, LPCWSTR, MSIDATABASE ** ) DECLSPEC_HIDDEN;
extern UINT MSI_DatabaseOpenViewW(MSIDATABASE *, LPCWSTR, MSIQUERY ** ) DECLSPEC_HIDDEN;
diff --git a/dlls/msi/streams.c b/dlls/msi/streams.c
index b91fe88..28a572d 100644
--- a/dlls/msi/streams.c
+++ b/dlls/msi/streams.c
@@ -181,9 +181,6 @@ static UINT STREAMS_set_row(struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, U
goto done;
}
- encname = encode_streamname(FALSE, name);
- msi_destroy_stream(sv->db, encname);
-
r = write_stream_data(sv->db->storage, name, data, count, FALSE);
if (r != ERROR_SUCCESS)
{
@@ -195,6 +192,7 @@ static UINT STREAMS_set_row(struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, U
if (!stream)
goto done;
+ encname = encode_streamname(FALSE, name);
hr = IStorage_OpenStream(sv->db->storage, encname, 0,
STGM_READ | STGM_SHARE_EXCLUSIVE, 0, &stream->stream);
if (FAILED(hr))
More information about the wine-cvs
mailing list