Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: installer/src/installer-lib/database.cpp

Issue 5675960980471808: Updated installer with custom action (Closed)
Patch Set: Created March 8, 2014, 5:06 a.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: installer/src/installer-lib/database.cpp
===================================================================
--- a/installer/src/installer-lib/database.cpp
+++ b/installer/src/installer-lib/database.cpp
@@ -8,22 +8,19 @@
//-----------------------------------------------------------------------------------------
// Database
//-----------------------------------------------------------------------------------------
-/**
- * \par Implementation Notes
- * An MSI database handle is an overloaded type, used both for installation databases and one opened outside an installation.
- * Hence this base constructor initializes with that handle.
- *
- * \sa MSDN "Obtaining a Database Handle"
- * http://msdn.microsoft.com/en-us/library/windows/desktop/aa370541(v=vs.85).aspx
- */
-Database::Database( MSIHANDLE handle )
- : handle( handle )
+msi_handle Database::open_view( const wchar_t * query )
{
-}
-
-Database::~Database()
-{
- MsiCloseHandle( handle ) ;
+ MSIHANDLE view_handle ;
+ UINT x = MsiDatabaseOpenView( handle, query, & view_handle ) ;
+ if ( x == ERROR_BAD_QUERY_SYNTAX )
+ {
+ throw std::runtime_error( "Bad MSI query syntax" ) ;
+ }
+ else if ( x == ERROR_INVALID_HANDLE )
+ {
+ throw std::runtime_error( "Invalid handle" ) ;
+ }
+ return msi_handle( view_handle ) ;
}
//-----------------------------------------------------------------------------------------
@@ -37,14 +34,14 @@
* Return value of this function, a handle, must be released in order to avoid a resource leak.
* Passing it as an argument to the Database constructor is adequate.
*/
-MSIHANDLE get_active_database( Immediate_Session & session )
+msi_handle get_active_database( Immediate_Session & session )
{
- MSIHANDLE h = MsiGetActiveDatabase( session.handle ) ;
+ MSIHANDLE h( MsiGetActiveDatabase( session.handle ) ) ;
if ( h == 0 )
{
throw std::runtime_error( "Failed to retrieve active databases" ) ;
}
- return h ;
+ return msi_handle( h ) ;
}
/**
@@ -55,4 +52,46 @@
: Database( get_active_database( session ) )
{
// empty body
-}
+} ;
+
+//-----------------------------------------------------------------------------------------
+// View
+//-----------------------------------------------------------------------------------------
+/**
+ * Implementation function for View::first().
+ */
+void view_first_body( UINT x )
+{
+ if ( x != ERROR_SUCCESS )
+ {
+ throw std::runtime_error( "MsiViewExecute call failed" ) ;
+ }
+}
+
+Record View::first()
+{
+ view_first_body( MsiViewExecute( _handle, 0 ) ) ;
+ return next() ;
+}
+
+Record View::first( Record & arguments )
+{
+ view_first_body( MsiViewExecute( _handle, arguments._handle ) ) ;
+ return next() ;
+}
+
+Record View::next()
+{
+ MSIHANDLE h ;
+ UINT x = MsiViewFetch( _handle, & h ) ;
+ if ( x == ERROR_NO_MORE_ITEMS )
+ {
+ return Record( Record::null_t() ) ;
+ }
+ else if ( x == ERROR_SUCCESS )
+ {
+ return Record( msi_handle( h ) ) ;
+ }
+ throw std::runtime_error( "Error fetch record from view" ) ;
+}
+

Powered by Google App Engine
This is Rietveld