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