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