Create a helper function to fetch a single record from a query.
This commit is contained in:
parent
9ffac609ea
commit
6309892499
@ -341,20 +341,12 @@ static LPWSTR msi_get_checkbox_value( msi_dialog *dialog, LPCWSTR prop )
|
|||||||
'`','P','r','o','p','e','r','t','y','`',' ','=',' ',
|
'`','P','r','o','p','e','r','t','y','`',' ','=',' ',
|
||||||
'\'','%','s','\'',0
|
'\'','%','s','\'',0
|
||||||
};
|
};
|
||||||
MSIQUERY *view = NULL;
|
|
||||||
MSIRECORD *rec = NULL;
|
MSIRECORD *rec = NULL;
|
||||||
LPCWSTR val = NULL;
|
LPCWSTR val = NULL;
|
||||||
LPWSTR ret = NULL;
|
LPWSTR ret = NULL;
|
||||||
UINT r;
|
|
||||||
|
|
||||||
/* find if there is a value associated with the checkbox */
|
/* find if there is a value associated with the checkbox */
|
||||||
r = MSI_OpenQuery( dialog->package->db, &view, query, prop);
|
rec = MSI_QueryGetRecord( dialog->package->db, query, prop );
|
||||||
if( r != ERROR_SUCCESS )
|
|
||||||
return ret;
|
|
||||||
MSI_ViewExecute( view, NULL );
|
|
||||||
MSI_ViewFetch( view, &rec );
|
|
||||||
MSI_ViewClose( view );
|
|
||||||
msiobj_release( &view->hdr );
|
|
||||||
if (!rec)
|
if (!rec)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
@ -802,22 +794,13 @@ static MSIRECORD *msi_get_dialog_record( msi_dialog *dialog )
|
|||||||
'W','H','E','R','E',' ',
|
'W','H','E','R','E',' ',
|
||||||
'`','D','i','a','l','o','g','`',' ','=',' ','\'','%','s','\'',0};
|
'`','D','i','a','l','o','g','`',' ','=',' ','\'','%','s','\'',0};
|
||||||
MSIPACKAGE *package = dialog->package;
|
MSIPACKAGE *package = dialog->package;
|
||||||
MSIQUERY *view = NULL;
|
|
||||||
MSIRECORD *rec = NULL;
|
MSIRECORD *rec = NULL;
|
||||||
UINT r;
|
|
||||||
|
|
||||||
TRACE("%p %s\n", dialog, debugstr_w(dialog->name) );
|
TRACE("%p %s\n", dialog, debugstr_w(dialog->name) );
|
||||||
|
|
||||||
r = MSI_OpenQuery( package->db, &view, query, dialog->name );
|
rec = MSI_QueryGetRecord( package->db, query, dialog->name );
|
||||||
if( r != ERROR_SUCCESS )
|
if( !rec )
|
||||||
{
|
|
||||||
ERR("query failed for dialog %s\n", debugstr_w(dialog->name));
|
ERR("query failed for dialog %s\n", debugstr_w(dialog->name));
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
MSI_ViewExecute( view, NULL );
|
|
||||||
MSI_ViewFetch( view, &rec );
|
|
||||||
MSI_ViewClose( view );
|
|
||||||
msiobj_release( &view->hdr );
|
|
||||||
|
|
||||||
return rec;
|
return rec;
|
||||||
}
|
}
|
||||||
|
@ -340,6 +340,7 @@ extern UINT MSI_DatabaseOpenViewW(MSIDATABASE *, LPCWSTR, MSIQUERY ** );
|
|||||||
extern UINT MSI_OpenQuery( MSIDATABASE *, MSIQUERY **, LPCWSTR, ... );
|
extern UINT MSI_OpenQuery( MSIDATABASE *, MSIQUERY **, LPCWSTR, ... );
|
||||||
typedef UINT (*record_func)( MSIRECORD *, LPVOID );
|
typedef UINT (*record_func)( MSIRECORD *, LPVOID );
|
||||||
extern UINT MSI_IterateRecords( MSIQUERY *, DWORD *, record_func, LPVOID );
|
extern UINT MSI_IterateRecords( MSIQUERY *, DWORD *, record_func, LPVOID );
|
||||||
|
extern MSIRECORD *MSI_QueryGetRecord( MSIDATABASE *db, LPCWSTR query, ... );
|
||||||
extern UINT MSI_DatabaseImport( MSIDATABASE *, LPCWSTR, LPCWSTR );
|
extern UINT MSI_DatabaseImport( MSIDATABASE *, LPCWSTR, LPCWSTR );
|
||||||
extern UINT MSI_DatabaseExport( MSIDATABASE *, LPCWSTR, LPCWSTR, LPCWSTR );
|
extern UINT MSI_DatabaseExport( MSIDATABASE *, LPCWSTR, LPCWSTR, LPCWSTR );
|
||||||
extern UINT MSI_DatabaseGetPrimaryKeys( MSIDATABASE *, LPCWSTR, MSIRECORD ** );
|
extern UINT MSI_DatabaseGetPrimaryKeys( MSIDATABASE *, LPCWSTR, MSIRECORD ** );
|
||||||
|
@ -139,7 +139,8 @@ UINT MSI_DatabaseOpenViewW(MSIDATABASE *db,
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT MSI_OpenQuery( MSIDATABASE *db, MSIQUERY **view, LPCWSTR fmt, ... )
|
static UINT MSI_OpenQueryV( MSIDATABASE *db, MSIQUERY **view,
|
||||||
|
LPCWSTR fmt, va_list args )
|
||||||
{
|
{
|
||||||
LPWSTR szQuery;
|
LPWSTR szQuery;
|
||||||
LPCWSTR p;
|
LPCWSTR p;
|
||||||
@ -147,7 +148,7 @@ UINT MSI_OpenQuery( MSIDATABASE *db, MSIQUERY **view, LPCWSTR fmt, ... )
|
|||||||
va_list va;
|
va_list va;
|
||||||
|
|
||||||
/* figure out how much space we need to allocate */
|
/* figure out how much space we need to allocate */
|
||||||
va_start(va, fmt);
|
va = args;
|
||||||
sz = lstrlenW(fmt) + 1;
|
sz = lstrlenW(fmt) + 1;
|
||||||
p = fmt;
|
p = fmt;
|
||||||
while (*p)
|
while (*p)
|
||||||
@ -173,13 +174,11 @@ UINT MSI_OpenQuery( MSIDATABASE *db, MSIQUERY **view, LPCWSTR fmt, ... )
|
|||||||
}
|
}
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
va_end(va);
|
|
||||||
|
|
||||||
/* construct the string */
|
/* construct the string */
|
||||||
szQuery = HeapAlloc(GetProcessHeap(), 0, sz*sizeof(WCHAR));
|
szQuery = HeapAlloc(GetProcessHeap(), 0, sz*sizeof(WCHAR));
|
||||||
va_start(va, fmt);
|
va = args;
|
||||||
vsnprintfW(szQuery, sz, fmt, va);
|
vsnprintfW(szQuery, sz, fmt, va);
|
||||||
va_end(va);
|
|
||||||
|
|
||||||
/* perform the query */
|
/* perform the query */
|
||||||
rc = MSI_DatabaseOpenViewW(db, szQuery, view);
|
rc = MSI_DatabaseOpenViewW(db, szQuery, view);
|
||||||
@ -187,6 +186,18 @@ UINT MSI_OpenQuery( MSIDATABASE *db, MSIQUERY **view, LPCWSTR fmt, ... )
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UINT MSI_OpenQuery( MSIDATABASE *db, MSIQUERY **view, LPCWSTR fmt, ... )
|
||||||
|
{
|
||||||
|
UINT r;
|
||||||
|
va_list va;
|
||||||
|
|
||||||
|
va_start(va, fmt);
|
||||||
|
r = MSI_OpenQueryV( db, view, fmt, va );
|
||||||
|
va_end(va);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
UINT MSI_IterateRecords( MSIQUERY *view, DWORD *count,
|
UINT MSI_IterateRecords( MSIQUERY *view, DWORD *count,
|
||||||
record_func func, LPVOID param )
|
record_func func, LPVOID param )
|
||||||
{
|
{
|
||||||
@ -223,6 +234,28 @@ UINT MSI_IterateRecords( MSIQUERY *view, DWORD *count,
|
|||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* return a single record from a query */
|
||||||
|
MSIRECORD *MSI_QueryGetRecord( MSIDATABASE *db, LPCWSTR fmt, ... )
|
||||||
|
{
|
||||||
|
MSIRECORD *rec = NULL;
|
||||||
|
MSIQUERY *view = NULL;
|
||||||
|
UINT r;
|
||||||
|
va_list va;
|
||||||
|
|
||||||
|
va_start(va, fmt);
|
||||||
|
r = MSI_OpenQueryV( db, &view, fmt, va );
|
||||||
|
va_end(va);
|
||||||
|
|
||||||
|
if( r == ERROR_SUCCESS )
|
||||||
|
{
|
||||||
|
MSI_ViewExecute( view, NULL );
|
||||||
|
MSI_ViewFetch( view, &rec );
|
||||||
|
MSI_ViewClose( view );
|
||||||
|
msiobj_release( &view->hdr );
|
||||||
|
}
|
||||||
|
return rec;
|
||||||
|
}
|
||||||
|
|
||||||
UINT WINAPI MsiDatabaseOpenViewW(MSIHANDLE hdb,
|
UINT WINAPI MsiDatabaseOpenViewW(MSIHANDLE hdb,
|
||||||
LPCWSTR szQuery, MSIHANDLE *phView)
|
LPCWSTR szQuery, MSIHANDLE *phView)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user