msi: iterate component, feature and file loading

Aric Stewart aric at codeweavers.com
Thu Jun 23 08:34:37 CDT 2005


rework component, feature and file loading  to use MSI_IterateRecords
-------------- next part --------------
Index: dlls/msi/action.c
===================================================================
RCS file: /home/wine/wine/dlls/msi/action.c,v
retrieving revision 1.160
diff -u -r1.160 action.c
--- dlls/msi/action.c	23 Jun 2005 11:04:09 -0000	1.160
+++ dlls/msi/action.c	23 Jun 2005 13:29:56 -0000
@@ -1016,8 +1016,68 @@
     return index;
 }
 
-static void load_feature(MSIPACKAGE* package, MSIRECORD * row)
+typedef struct {
+    MSIPACKAGE *package;
+    INT index;
+    INT cnt;
+} _ilfs;
+
+static UINT iterate_component_check(MSIRECORD *row, LPVOID param)
+{
+    _ilfs* ilfs= (_ilfs*)param;
+    INT c_indx;
+
+    c_indx = load_component(ilfs->package,row);
+
+    ilfs->package->features[ilfs->index].Components[ilfs->cnt] = c_indx;
+    ilfs->package->features[ilfs->index].ComponentCount ++;
+    TRACE("Loaded new component to index %i\n",c_indx);
+
+    return ERROR_SUCCESS;
+}
+
+static UINT iterate_load_featurecomponents(MSIRECORD *row, LPVOID param)
 {
+    _ilfs* ilfs= (_ilfs*)param;
+    LPCWSTR component;
+    DWORD rc;
+    INT c_indx;
+    INT cnt = ilfs->package->features[ilfs->index].ComponentCount;
+    MSIQUERY * view;
+    static const WCHAR Query[] = 
+        {'S','E','L','E','C','T',' ','*',' ','F','R', 'O','M',' ', 
+         '`','C','o','m','p','o','n','e','n','t','`',' ',
+         'W','H','E','R','E',' ', 
+         '`','C','o','m','p','o','n','e','n','t','`',' ',
+         '=','\'','%','s','\'',0};
+
+    component = MSI_RecordGetString(row,1);
+
+    /* check to see if the component is already loaded */
+    c_indx = get_loaded_component(ilfs->package,component);
+    if (c_indx != -1)
+    {
+        TRACE("Component %s already loaded at %i\n", debugstr_w(component),
+                        c_indx);
+        ilfs->package->features[ilfs->index].Components[cnt] = c_indx;
+        ilfs->package->features[ilfs->index].ComponentCount ++;
+        return ERROR_SUCCESS;
+    }
+
+    rc = MSI_OpenQuery(ilfs->package->db, &view, Query, component);
+    if (rc != ERROR_SUCCESS)
+        return ERROR_SUCCESS;
+
+    ilfs->cnt = cnt;
+    rc = MSI_IterateRecords(view, NULL, iterate_component_check, ilfs);
+    msiobj_release( &view->hdr );
+
+    return ERROR_SUCCESS;
+}
+
+static UINT load_feature(MSIRECORD * row, LPVOID param)
+{
+    MSIPACKAGE* package = (MSIPACKAGE*)param;
     int index = package->loaded_features;
     DWORD sz;
     static const WCHAR Query1[] = 
@@ -1027,17 +1087,12 @@
          'C','o','m','p','o','n','e','n','t','s','`',' ',
          'W','H','E','R','E',' ',
          '`','F','e', 'a','t','u','r','e','_','`',' ','=','\'','%','s','\'',0};
-    static const WCHAR Query2[] = 
-        {'S','E','L','E','C','T',' ','*',' ','F','R', 'O','M',' ', 
-         '`','C','o','m','p','o','n','e','n','t','`',' ',
-         'W','H','E','R','E',' ', 
-         '`','C','o','m','p','o','n','e','n','t','`',' ',
-         '=','\'','%','s','\'',0};
     MSIQUERY * view;
-    MSIQUERY * view2;
-    MSIRECORD * row2;
-    MSIRECORD * row3;
     UINT    rc;
+    _ilfs ilfs;
+
+    ilfs.package = package;
+    ilfs.index = index;
 
     /* fill in the data */
 
@@ -1084,79 +1139,20 @@
 
     /* load feature components */
 
-    rc = MSI_OpenQuery(package->db, &view, Query1, package->features[index].Feature);
+    rc = MSI_OpenQuery(package->db, &view, Query1, 
+                    package->features[index].Feature);
     if (rc != ERROR_SUCCESS)
-        return;
-    rc = MSI_ViewExecute(view,0);
-    if (rc != ERROR_SUCCESS)
-    {
-        MSI_ViewClose(view);
-        msiobj_release(&view->hdr);
-        return;
-    }
-    while (1)
-    {
-        LPCWSTR component;
-        DWORD rc;
-        INT c_indx;
-        INT cnt = package->features[index].ComponentCount;
-
-        rc = MSI_ViewFetch(view,&row2);
-        if (rc != ERROR_SUCCESS)
-            break;
-
-        component = MSI_RecordGetString(row2,1);
-
-        /* check to see if the component is already loaded */
-        c_indx = get_loaded_component(package,component);
-        if (c_indx != -1)
-        {
-            TRACE("Component %s already loaded at %i\n", debugstr_w(component),
-                  c_indx);
-            package->features[index].Components[cnt] = c_indx;
-            package->features[index].ComponentCount ++;
-            msiobj_release( &row2->hdr );
-            continue;
-        }
-
-        rc = MSI_OpenQuery(package->db, &view2, Query2, component);
-        if (rc != ERROR_SUCCESS)
-        {
-            msiobj_release( &row2->hdr );
-            continue;
-        }
-        rc = MSI_ViewExecute(view2,0);
-        if (rc != ERROR_SUCCESS)
-        {
-            msiobj_release( &row2->hdr );
-            MSI_ViewClose(view2);
-            msiobj_release( &view2->hdr );  
-            continue;
-        }
-        while (1)
-        {
-            DWORD rc;
+        return ERROR_SUCCESS;
 
-            rc = MSI_ViewFetch(view2,&row3);
-            if (rc != ERROR_SUCCESS)
-                break;
-            c_indx = load_component(package,row3);
-            msiobj_release( &row3->hdr );
-
-            package->features[index].Components[cnt] = c_indx;
-            package->features[index].ComponentCount ++;
-            TRACE("Loaded new component to index %i\n",c_indx);
-        }
-        MSI_ViewClose(view2);
-        msiobj_release( &view2->hdr );
-        msiobj_release( &row2->hdr );
-    }
-    MSI_ViewClose(view);
+    MSI_IterateRecords(view, NULL, iterate_load_featurecomponents , &ilfs);
     msiobj_release(&view->hdr);
+
+    return ERROR_SUCCESS;
 }
 
-static UINT load_file(MSIPACKAGE* package, MSIRECORD * row)
+static UINT load_file(MSIRECORD *row, LPVOID param)
 {
+    MSIPACKAGE* package = (MSIPACKAGE*)param;
     DWORD index = package->loaded_files;
     LPCWSTR component;
 
@@ -1203,7 +1199,6 @@
 static UINT load_all_files(MSIPACKAGE *package)
 {
     MSIQUERY * view;
-    MSIRECORD * row;
     UINT rc;
     static const WCHAR Query[] =
         {'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ',
@@ -1216,27 +1211,8 @@
     rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
     if (rc != ERROR_SUCCESS)
         return ERROR_SUCCESS;
-   
-    rc = MSI_ViewExecute(view, 0);
-    if (rc != ERROR_SUCCESS)
-    {
-        MSI_ViewClose(view);
-        msiobj_release(&view->hdr);
-        return ERROR_SUCCESS;
-    }
 
-    while (1)
-    {
-        rc = MSI_ViewFetch(view,&row);
-        if (rc != ERROR_SUCCESS)
-        {
-            rc = ERROR_SUCCESS;
-            break;
-        }
-        load_file(package,row);
-        msiobj_release(&row->hdr);
-    }
-    MSI_ViewClose(view);
+    rc = MSI_IterateRecords(view, NULL, load_file, package);
     msiobj_release(&view->hdr);
 
     return ERROR_SUCCESS;
@@ -1259,7 +1235,6 @@
 static UINT ACTION_CostInitialize(MSIPACKAGE *package)
 {
     MSIQUERY * view;
-    MSIRECORD * row;
     UINT rc;
     static const WCHAR Query_all[] =
         {'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ',
@@ -1280,25 +1255,8 @@
     rc = MSI_DatabaseOpenViewW(package->db,Query_all,&view);
     if (rc != ERROR_SUCCESS)
         return rc;
-    rc = MSI_ViewExecute(view,0);
-    if (rc != ERROR_SUCCESS)
-    {
-        MSI_ViewClose(view);
-        msiobj_release(&view->hdr);
-        return rc;
-    }
-    while (1)
-    {
-        DWORD rc;
 
-        rc = MSI_ViewFetch(view,&row);
-        if (rc != ERROR_SUCCESS)
-            break;
-       
-        load_feature(package,row); 
-        msiobj_release(&row->hdr);
-    }
-    MSI_ViewClose(view);
+    rc = MSI_IterateRecords(view, NULL, load_feature, package);
     msiobj_release(&view->hdr);
 
     load_all_files(package);



More information about the wine-patches mailing list