msi: Move table creation to table.c.

This commit is contained in:
Rob Shearman 2007-04-23 08:21:32 +01:00 committed by Alexandre Julliard
parent 3aa9a25cb3
commit ba0507a178
3 changed files with 105 additions and 91 deletions

View File

@ -59,101 +59,12 @@ static UINT CREATE_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT
static UINT CREATE_execute( struct tagMSIVIEW *view, MSIRECORD *record )
{
MSICREATEVIEW *cv = (MSICREATEVIEW*)view;
column_info *col;
UINT r, nField;
static const WCHAR szTables[] = { '_','T','a','b','l','e','s',0 };
static const WCHAR szColumns[] = { '_','C','o','l','u','m','n','s',0 };
MSIVIEW *tv = NULL;
MSIRECORD *rec = NULL;
MSITABLE *table;
TRACE("%p Table %s (%s)\n", cv, debugstr_w(cv->name),
cv->bIsTemp?"temporary":"permanent");
/* only add tables that don't exist already */
if( TABLE_Exists(cv->db, cv->name ) )
return ERROR_BAD_QUERY_SYNTAX;
r = TABLE_CreateView( cv->db, szTables, &tv );
TRACE("CreateView returned %x\n", r);
if( r )
return r;
r = tv->ops->execute( tv, 0 );
TRACE("tv execute returned %x\n", r);
if( r )
goto err;
rec = MSI_CreateRecord( 1 );
if( !rec )
goto err;
r = MSI_RecordSetStringW( rec, 1, cv->name );
if( r )
goto err;
r = tv->ops->insert_row( tv, rec );
TRACE("insert_row returned %x\n", r);
if( r )
goto err;
tv->ops->delete( tv );
tv = NULL;
msiobj_release( &rec->hdr );
/* add each column to the _Columns table */
r = TABLE_CreateView( cv->db, szColumns, &tv );
if( r )
return r;
r = tv->ops->execute( tv, 0 );
TRACE("tv execute returned %x\n", r);
if( r )
goto err;
rec = MSI_CreateRecord( 4 );
if( !rec )
goto err;
r = MSI_RecordSetStringW( rec, 1, cv->name );
if( r )
goto err;
/*
* need to set the table, column number, col name and type
* for each column we enter in the table
*/
nField = 1;
for( col = cv->col_info; col; col = col->next )
{
r = MSI_RecordSetInteger( rec, 2, nField );
if( r )
goto err;
r = MSI_RecordSetStringW( rec, 3, col->column );
if( r )
goto err;
r = MSI_RecordSetInteger( rec, 4, col->type );
if( r )
goto err;
r = tv->ops->insert_row( tv, rec );
if( r )
goto err;
nField++;
}
if( !col )
r = ERROR_SUCCESS;
err:
if (rec)
msiobj_release( &rec->hdr );
/* FIXME: remove values from the string table on error */
if( tv )
tv->ops->delete( tv );
return r;
return msi_create_table( cv->db, cv->name, cv->col_info, !cv->bIsTemp, &table);
}
static UINT CREATE_close( struct tagMSIVIEW *view )

View File

@ -127,4 +127,7 @@ int sqliteGetToken(const WCHAR *z, int *tokenType);
MSIRECORD *msi_query_merge_record( UINT fields, column_info *vl, MSIRECORD *rec );
UINT msi_create_table( MSIDATABASE *db, LPCWSTR name, column_info *col_info,
BOOL persistent, MSITABLE **table_ret);
#endif /* __WINE_MSI_QUERY_H */

View File

@ -593,6 +593,106 @@ static UINT table_get_column_info( MSIDATABASE *db, LPCWSTR name, MSICOLUMNINFO
return r;
}
static UINT get_table( MSIDATABASE *db, LPCWSTR name, MSITABLE **table_ret );
UINT msi_create_table( MSIDATABASE *db, LPCWSTR name, column_info *col_info,
BOOL persistent, MSITABLE **table_ret)
{
UINT r, nField;
MSIVIEW *tv = NULL;
MSIRECORD *rec = NULL;
column_info *col;
/* only add tables that don't exist already */
if( TABLE_Exists(db, name ) )
return ERROR_BAD_QUERY_SYNTAX;
r = TABLE_CreateView( db, szTables, &tv );
TRACE("CreateView returned %x\n", r);
if( r )
return r;
r = tv->ops->execute( tv, 0 );
TRACE("tv execute returned %x\n", r);
if( r )
goto err;
rec = MSI_CreateRecord( 1 );
if( !rec )
goto err;
r = MSI_RecordSetStringW( rec, 1, name );
if( r )
goto err;
r = tv->ops->insert_row( tv, rec );
TRACE("insert_row returned %x\n", r);
if( r )
goto err;
tv->ops->delete( tv );
tv = NULL;
msiobj_release( &rec->hdr );
/* add each column to the _Columns table */
r = TABLE_CreateView( db, szColumns, &tv );
if( r )
return r;
r = tv->ops->execute( tv, 0 );
TRACE("tv execute returned %x\n", r);
if( r )
goto err;
rec = MSI_CreateRecord( 4 );
if( !rec )
goto err;
r = MSI_RecordSetStringW( rec, 1, name );
if( r )
goto err;
/*
* need to set the table, column number, col name and type
* for each column we enter in the table
*/
nField = 1;
for( col = col_info; col; col = col->next )
{
r = MSI_RecordSetInteger( rec, 2, nField );
if( r )
goto err;
r = MSI_RecordSetStringW( rec, 3, col->column );
if( r )
goto err;
r = MSI_RecordSetInteger( rec, 4, col->type );
if( r )
goto err;
r = tv->ops->insert_row( tv, rec );
if( r )
goto err;
nField++;
}
if( !col )
r = ERROR_SUCCESS;
err:
if (rec)
msiobj_release( &rec->hdr );
/* FIXME: remove values from the string table on error */
if( tv )
tv->ops->delete( tv );
if (r == ERROR_SUCCESS)
r = get_table( db, name, table_ret );
return r;
}
static UINT get_table( MSIDATABASE *db, LPCWSTR name, MSITABLE **table_ret )
{
MSITABLE *table;