38 #include "wine/unicode.h" 42 #define MSITABLE_HASH_TABLE_SIZE 37 94 #define MAX_STREAM_NAME 0x1f 102 return bytes_per_strref;
104 if( (col->
type & 0xff) <= 2)
107 if( (col->
type & 0xff) != 4 )
108 ERR(
"Invalid column size %u\n", col->
type & 0xff);
115 if( (
x>=
'0') && (
x<=
'9') )
117 if( (
x>=
'A') && (
x<=
'Z') )
119 if( (
x>=
'a') && (
x<=
'z') )
152 if( ( ch < 0x80 ) && (
utf2mime(ch) >= 0 ) )
181 return x - 10 - 26 +
'a';
182 if(
x == (10+26+26) )
192 while ( (ch = *
in++) )
194 if( (ch >= 0x3800 ) && (ch < 0x4840 ) )
221 r = IStorage_EnumElements( stg, 0,
NULL, 0, &stgenum );
229 r = IEnumSTATSTG_Next( stgenum, 1, &
stat, &
count );
233 TRACE(
"stream %2d -> %s %s\n",
n,
239 IEnumSTATSTG_Release( stgenum );
257 r = IStorage_OpenStream(stg, encname,
NULL,
262 WARN(
"open stream failed r = %08x - empty table?\n",
r);
266 r = IStream_Stat(stm, &
stat, STATFLAG_NONAME );
269 WARN(
"open stream failed r = %08x!\n",
r);
273 if(
stat.cbSize.QuadPart >> 32 )
279 sz =
stat.cbSize.QuadPart;
283 WARN(
"couldn't allocate memory r=%08x!\n",
r);
292 WARN(
"read stream failed r = %08x!\n",
r);
301 IStream_Release( stm );
318 r = IStorage_OpenStream( stg, encname,
NULL,
322 r = IStorage_CreateStream( stg, encname,
328 WARN(
"open stream failed r = %08x\n",
r);
333 r = IStream_SetSize( stm,
size );
336 WARN(
"Failed to SetSize\n");
341 r = IStream_Seek( stm,
pos, STREAM_SEEK_SET,
NULL );
344 WARN(
"Failed to Seek\n");
353 WARN(
"Failed to Write\n");
361 IStream_Release( stm );
397 last_col = &cols[
count - 1];
405 UINT rawsize = 0,
i,
j, row_size, row_size_mem;
417 TRACE(
"Read %d bytes\n", rawsize );
419 if( rawsize % row_size )
421 WARN(
"Table size is invalid %d/%d\n", rawsize, row_size );
425 if ((
t->row_count = rawsize / row_size))
432 TRACE(
"Transposing data from %d rows\n",
t->row_count );
433 for (
i = 0;
i <
t->row_count;
i++)
435 UINT ofs = 0, ofs_mem = 0;
440 t->data_persistent[
i] =
TRUE;
442 for (
j = 0;
j <
t->col_count;
j++)
448 if (
n != 2 &&
n != 3 &&
n != 4 )
450 ERR(
"oops - unknown column width %d\n",
n);
455 for (
k = 0;
k <
m;
k++)
458 t->data[
i][ofs_mem +
k] = rawdata[ofs *
t->row_count +
i *
n +
k];
460 t->data[
i][ofs_mem +
k] = 0;
465 for (
k = 0;
k <
n;
k++)
466 t->data[
i][ofs_mem +
k] = rawdata[ofs *
t->row_count +
i *
n +
k];
506 for (
i = 0; colinfo &&
i <
count;
i++)
513 TRACE(
"column %d is [%s] with type %08x ofs %d\n",
538 for (
i = 0;
i <
n;
i++)
540 if (colinfo &&
i < *sz) colinfo[
i] =
p[
i];
541 if (colinfo &&
i >= *sz)
break;
552 UINT r, column_count = 0;
561 *pcount = column_count;
601 table->row_count = 0;
605 table->col_count = 0;
654 ERR(
"couldn't load _Columns table\n");
665 TRACE(
"Table id is %d, row count is %d\n", table_id,
table->row_count);
670 if (colinfo)
memset( colinfo, 0, maxcount *
sizeof(*colinfo) );
681 if (col < 1 || col > maxcount)
683 ERR(
"column %d out of range (maxcount: %d)\n", col, maxcount);
687 if (colinfo[col - 1].
number)
689 ERR(
"duplicate column %d\n", col);
693 colinfo[col - 1].
number = col;
696 sizeof(
USHORT) ) - (1 << 15);
697 colinfo[col - 1].
offset = 0;
705 if (colinfo &&
n != maxcount)
707 ERR(
"missing column in table %s\n",
debugstr_w(szTableName));
738 table->ref_count = 1;
739 table->row_count = 0;
743 table->col_count = 0;
744 table->persistent = persistent;
747 for( col = col_info; col; col = col->
next )
757 for(
i = 0, col = col_info; col;
i++, col = col->
next )
763 table->colinfo[
i ].number =
i + 1;
765 table->colinfo[
i ].type = col->type;
766 table->colinfo[
i ].offset = 0;
767 table->colinfo[
i ].ref_count = 0;
769 table->colinfo[
i ].temporary = col->temporary;
774 TRACE(
"CreateView returned %x\n",
r);
782 TRACE(
"tv execute returned %x\n",
r);
795 TRACE(
"insert_row returned %x\n",
r);
813 TRACE(
"tv execute returned %x\n",
r);
830 for( col = col_info; col; col = col->
next )
872 UINT rawsize,
i,
j, row_size, row_count;
882 row_count =
t->row_count;
883 for (
i = 0;
i <
t->row_count;
i++)
885 if (!
t->data_persistent[
i])
891 rawsize = row_count * row_size;
900 for (
i = 0;
i < row_count;
i++)
902 UINT ofs = 0, ofs_mem = 0;
904 if (!
t->data_persistent[
i])
break;
906 for (
j = 0;
j <
t->col_count;
j++)
912 if (
n != 2 &&
n != 3 &&
n != 4)
914 ERR(
"oops - unknown column width %d\n",
n);
920 if (
id > 1 << bytes_per_strref * 8)
922 ERR(
"string id %u out of range\n",
id);
926 for (
k = 0;
k <
n;
k++)
928 rawdata[ofs * row_count +
i *
n +
k] =
t->data[
i][ofs_mem +
k];
936 TRACE(
"writing %d bytes\n", rawsize);
951 old_count =
table->col_count;
957 if (!
table->col_count)
return;
962 for (
n = 0;
n <
table->row_count;
n++ )
965 if (old_count < table->col_count)
994 for(
i = 0;
i <
table->row_count;
i++ )
1024 if( (col==0) || (col>tv->
num_cols) )
1039 if (
n != 2 &&
n != 3 &&
n != 4)
1041 ERR(
"oops! what is %d bytes per column?\n",
n );
1095 static const WCHAR fmt[] = {
'%',
'd',0 };
1107 ERR(
"oops - unknown column width %d\n",
n );
1150 if( !
view->ops->fetch_int )
1156 ERR(
"fetching stream, error = %u\n",
r);
1175 if( (col==0) || (col>tv->
num_cols) )
1192 if (
n != 2 &&
n != 3 &&
n != 4 )
1194 ERR(
"oops! what is %d bytes per column?\n",
n );
1199 for (
i = 0;
i <
n;
i++ )
1218 'I',
'N',
'S',
'E',
'R',
'T',
' ',
'I',
'N',
'T',
'O',
' ',
1219 '`',
'_',
'S',
't',
'r',
'e',
'a',
'm',
's',
'`',
' ',
1220 '(',
'`',
'N',
'a',
'm',
'e',
'`',
',',
'`',
'D',
'a',
't',
'a',
'`',
')',
' ',
1221 'V',
'A',
'L',
'U',
'E',
'S',
' ',
'(',
'?',
',',
'?',
')',0};
1222 static const WCHAR update[] = {
1223 'U',
'P',
'D',
'A',
'T',
'E',
' ',
'`',
'_',
'S',
't',
'r',
'e',
'a',
'm',
's',
'`',
' ',
1224 'S',
'E',
'T',
' ',
'`',
'D',
'a',
't',
'a',
'`',
' ',
'=',
' ',
'?',
' ',
1225 'W',
'H',
'E',
'R',
'E',
' ',
'`',
'N',
'a',
'm',
'e',
'`',
' ',
'=',
' ',
'?',0};
1282 if ( (iField <= 0) ||
1308 if (ival == 0x80000000) *pvalue = 0x8000;
1312 if (*pvalue & 0xffff0000)
1314 ERR(
"field %u value %d out of range\n", iField, *pvalue - 0x8000);
1322 *pvalue = ival ^ 0x80000000;
1345 if ( !(
mask&(1<<
i)) )
1371 IStream_Release( stm );
1376 IStream_Release( stm );
1421 BOOL **data_persist_ptr;
1424 TRACE(
"%p %s\n",
view, temporary ?
"TRUE" :
"FALSE");
1439 sz = (*row_count + 1) *
sizeof (
BYTE*);
1450 sz = (*row_count + 1) *
sizeof (
BOOL);
1451 if( *data_persist_ptr )
1463 (*data_ptr)[*row_count] =
row;
1465 *data_persist_ptr =
b;
1466 (*data_persist_ptr)[*row_count] = !temporary;
1556 TRACE(
"skipping binary column\n");
1604 WARN(
"TABLE_fetch_int should not fail here %u\n",
r);
1611 else if (ivalue ==
x)
1613 if (i < tv->
num_cols - 1)
continue;
1626 TRACE(
"%p %p\n", tv, rec);
1630 idx = (low + high) / 2;
1643 TRACE(
"found %u\n", high + 1);
1652 TRACE(
"%p %p %s\n", tv, rec, temporary ?
"TRUE" :
"FALSE" );
1663 TRACE(
"insert_row returned %08x\n",
r);
1733 ERR(
"can't find row to modify\n");
1738 if (
row != new_row + 1)
1797 TRACE(
"%p %d %p\n",
view, eModifyMode, rec );
1799 switch (eModifyMode)
1855 FIXME(
"%p %d %p - mode not implemented\n",
view, eModifyMode, rec );
1891 if( (col==0) || (col > tv->
num_cols) )
1928 new_entry->
value = row_value;
1933 while (prev_entry->
next)
1934 prev_entry = prev_entry->
next;
1935 prev_entry->
next = new_entry;
1945 entry = (*handle)->next;
2008 columns->ops->delete(columns);
2183 WARN(
"table not found\n");
2206 UINT r, bytes_per_strref;
2215 WARN(
"failed to save string table r=%08x\n",
r);
2224 WARN(
"failed to save table %s (r=%08x)\n",
2233 WARN(
"failed to commit changes 0x%08x\n",
hr);
2253 return t->persistent;
2272 TRACE(
"%p %p\n", tv, rec);
2333 mask = rawdata[0] | (rawdata[1] << 8);
2384 ofs += bytes_per_strref;
2395 TRACE(
" field %d [0x%04x]\n",
i+1,
val );
2401 TRACE(
" field %d [0x%08x]\n",
i+1,
val );
2404 ERR(
"oops - unknown column width %d\n",
n);
2416 for (
i = 0;
i < rawsize / 2;
i++)
2465 data[
i] += 0x80000000;
2484 ERR(
"TABLE_fetch_int shouldn't fail here\n");
2528 UINT bytes_per_strref )
2562 TRACE(
"name = %s columns = %u row_size = %u raw size = %u\n",
2566 for (
n = 0;
n < rawsize;)
2568 mask = rawdata[
n] | (rawdata[
n + 1] << 8);
2579 ERR(
"excess columns in transform: %u > %u\n",
num_cols, tv->num_cols);
2587 sz += bytes_per_strref;
2610 sz += bytes_per_strref;
2618 if (
n + sz > rawsize)
2663 TRACE(
"deleting row [%d]:\n",
row);
2666 WARN(
"failed to delete row %u\n",
r);
2670 TRACE(
"modifying full row [%d]:\n",
row);
2673 WARN(
"failed to modify row %u\n",
r);
2677 TRACE(
"modifying masked row [%d]:\n",
row);
2680 WARN(
"failed to modify row %u\n",
r);
2685 TRACE(
"inserting row\n");
2688 WARN(
"failed to insert row %u\n",
r);
2716 struct list transforms;
2724 UINT bytes_per_strref;
2727 TRACE(
"%p %p\n", db, stg );
2733 hr = IStorage_EnumElements( stg, 0,
NULL, 0, &stgenum );
2745 hr = IEnumSTATSTG_Next( stgenum, 1, &
stat, &
count );
2751 if (
name[0] != 0x4840 )
2771 property_update =
TRUE;
2826 IEnumSTATSTG_Release( stgenum );
static int mime2utf(int x)
const WCHAR * msi_string_lookup(const string_table *st, UINT id, int *len) DECLSPEC_HIDDEN
#define ERROR_INVALID_PARAMETER
static UINT TABLE_execute(struct tagMSIVIEW *view, MSIRECORD *record)
static UINT TABLE_get_row(struct tagMSIVIEW *view, UINT row, MSIRECORD **rec)
static UINT TABLE_find_matching_rows(struct tagMSIVIEW *view, UINT col, UINT val, UINT *row, MSIITERHANDLE *handle)
#define memmove(s1, s2, n)
UINT msi_get_stream(MSIDATABASE *, const WCHAR *, IStream **) DECLSPEC_HIDDEN
void MSI_CloseRecord(MSIOBJECTHDR *) DECLSPEC_HIDDEN
UINT MSI_RecordSetStringW(MSIRECORD *, UINT, LPCWSTR) DECLSPEC_HIDDEN
static UINT get_tablecolumns(MSIDATABASE *db, LPCWSTR szTableName, MSICOLUMNINFO *colinfo, UINT *sz)
static UINT * msi_record_to_row(const MSITABLEVIEW *tv, MSIRECORD *rec)
VOID WINAPI CoTaskMemFree(LPVOID ptr)
UINT MSI_RecordCopyField(MSIRECORD *, UINT, MSIRECORD *, UINT) DECLSPEC_HIDDEN
static UINT TABLE_insert_row(struct tagMSIVIEW *view, MSIRECORD *rec, UINT row, BOOL temporary)
static UINT TABLE_remove_column(struct tagMSIVIEW *view, LPCWSTR table, UINT number)
ActualNumberDriverObjects * sizeof(PDRIVER_OBJECT)) PDRIVER_OBJECT *DriverObjectList
UINT MSI_CommitTables(MSIDATABASE *db)
#define ERROR_NO_MORE_ITEMS
#define STGM_SHARE_EXCLUSIVE
struct tagMSICOLUMNHASHENTRY * next
static UINT get_stream_name(const MSITABLEVIEW *tv, UINT row, WCHAR **pstname)
static WCHAR * strdupW(const WCHAR *src)
static UINT msi_table_get_row_size(MSIDATABASE *db, const MSICOLUMNINFO *cols, UINT count, UINT bytes_per_strref)
static MSIRECORD * msi_get_transform_record(const MSITABLEVIEW *tv, const string_table *st, IStorage *stg, const BYTE *rawdata, UINT bytes_per_strref)
GLdouble GLdouble GLdouble r
GLuint GLuint GLsizei count
UINT MSI_RecordGetStringW(MSIRECORD *, UINT, LPWSTR, LPDWORD) DECLSPEC_HIDDEN
static UINT msi_refresh_record(struct tagMSIVIEW *view, MSIRECORD *rec, UINT row)
UINT MSI_ViewExecute(MSIQUERY *, MSIRECORD *) DECLSPEC_HIDDEN
static UINT TABLE_get_column_info(struct tagMSIVIEW *view, UINT n, LPCWSTR *name, UINT *type, BOOL *temporary, LPCWSTR *table_name)
UINT msi_create_table(MSIDATABASE *db, LPCWSTR name, column_info *col_info, MSICONDITION persistent)
__WINE_SERVER_LIST_INLINE void list_add_head(struct list *list, struct list *elem)
static UINT read_table_from_storage(MSIDATABASE *db, MSITABLE *t, IStorage *stg)
UINT MSI_RecordGetIStream(MSIRECORD *, UINT, IStream **) DECLSPEC_HIDDEN
static const MSICOLUMNINFO _Columns_cols[4]
static const WCHAR szNumber[]
static const MSICOLUMNINFO _Tables_cols[1]
#define MSITABLE_HASH_TABLE_SIZE
#define ERROR_NOT_ENOUGH_MEMORY
#define MSITYPE_IS_BINARY(type)
GLenum GLsizei GLenum GLenum const GLvoid * table
GLint GLint GLint GLint GLint x
struct tagMSICOLUMNHASHENTRY MSICOLUMNHASHENTRY
static UINT TABLE_delete(struct tagMSIVIEW *view)
struct _column_info * next
BOOL msi_add_string(string_table *st, const WCHAR *data, int len, enum StringPersistence persistence) DECLSPEC_HIDDEN
static UINT msi_row_matches(MSITABLEVIEW *tv, UINT row, const UINT *data, UINT *column)
string_table * msi_load_string_table(IStorage *stg, UINT *bytes_per_strref) DECLSPEC_HIDDEN
UINT(* execute)(struct tagMSIVIEW *view, MSIRECORD *record)
struct tagMSITABLEVIEW MSITABLEVIEW
static UINT get_defaulttablecolumns(MSIDATABASE *db, LPCWSTR name, MSICOLUMNINFO *colinfo, UINT *sz)
static void * msi_realloc(void *mem, size_t len) __WINE_ALLOC_SIZE(2)
static UINT TABLE_get_dimensions(struct tagMSIVIEW *view, UINT *rows, UINT *cols)
static void * msi_alloc_zero(size_t len) __WINE_ALLOC_SIZE(1)
static UINT get_table_value_from_record(MSITABLEVIEW *tv, MSIRECORD *rec, UINT iField, UINT *pvalue)
static UINT msi_table_find_row(MSITABLEVIEW *tv, MSIRECORD *rec, UINT *row, UINT *column)
__WINE_SERVER_LIST_INLINE struct list * list_head(const struct list *list)
__WINE_SERVER_LIST_INLINE void list_add_tail(struct list *list, struct list *elem)
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
UINT MSI_RecordSetInteger(MSIRECORD *, UINT, int) DECLSPEC_HIDDEN
VOID msi_destroy_stringtable(string_table *st) DECLSPEC_HIDDEN
#define ERROR_FUNCTION_FAILED
UINT STORAGES_CreateView(MSIDATABASE *db, MSIVIEW **view) DECLSPEC_HIDDEN
static unsigned char bytes[4]
void free_cached_tables(MSIDATABASE *db)
BOOL MSI_RecordIsNull(MSIRECORD *, UINT) DECLSPEC_HIDDEN
static size_t double number
static UINT table_get_column_info(MSIDATABASE *db, LPCWSTR name, MSICOLUMNINFO **pcols, UINT *pcount)
UINT read_stream_data(IStorage *stg, LPCWSTR stname, BOOL table, BYTE **pdata, UINT *psz)
static void dump_table(const string_table *st, const USHORT *rawdata, UINT rawsize)
static UINT bytes_per_column(MSIDATABASE *db, const MSICOLUMNINFO *col, UINT bytes_per_strref)
UINT msi_clone_properties(MSIDATABASE *) DECLSPEC_HIDDEN
static UINT table_create_new_row(struct tagMSIVIEW *view, UINT *num, BOOL temporary)
static const MSIVIEWOPS table_ops
static UINT msi_table_load_transform(MSIDATABASE *db, IStorage *stg, string_table *st, TRANSFORMDATA *transform, UINT bytes_per_strref)
static PROTOCOLDATA * pdata
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
void append_storage_to_db(MSIDATABASE *db, IStorage *stg)
static UINT msi_record_encoded_stream_name(const MSITABLEVIEW *tv, MSIRECORD *rec, LPWSTR *pstname)
static UINT TABLE_set_row(struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, UINT mask)
__WINE_SERVER_LIST_INLINE void list_remove(struct list *elem)
void dump_record(MSIRECORD *) DECLSPEC_HIDDEN
GLboolean GLboolean GLboolean b
static UINT TABLE_drop(struct tagMSIVIEW *view)
static UINT read_raw_int(const BYTE *data, UINT col, UINT bytes)
static UINT TABLE_fetch_stream(struct tagMSIVIEW *view, UINT row, UINT col, IStream **stm)
UINT msi_string2id(const string_table *st, const WCHAR *data, int len, UINT *id) DECLSPEC_HIDDEN
LPWSTR encode_streamname(BOOL bTable, LPCWSTR in)
static UINT msi_table_update(struct tagMSIVIEW *view, MSIRECORD *rec, UINT row)
static const WCHAR szStorages[]
static const WCHAR szColumns[]
UINT TABLE_CreateView(MSIDATABASE *db, LPCWSTR name, MSIVIEW **view)
int JSAMPARRAY int int num_rows
static UINT modify_delete_row(struct tagMSIVIEW *view, MSIRECORD *rec)
static int find_insert_index(MSITABLEVIEW *tv, MSIRECORD *rec)
UINT write_stream_data(IStorage *stg, LPCWSTR stname, LPCVOID data, UINT sz, BOOL bTable)
int JSAMPARRAY int int JDIMENSION num_cols
static int utf2mime(int x)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
int msiobj_release(MSIOBJECTHDR *info)
static void table_calc_column_offsets(MSIDATABASE *db, MSICOLUMNINFO *colinfo, DWORD count)
static UINT TABLE_add_ref(struct tagMSIVIEW *view)
void enum_stream_names(IStorage *stg)
MSIRECORD * MSI_CreateRecord(UINT) DECLSPEC_HIDDEN
GLsizei const GLchar *const * strings
static const WCHAR szStringPool[]
static const WCHAR szTables[]
UINT MSI_RecordSetStream(MSIRECORD *, UINT, IStream *) DECLSPEC_HIDDEN
#define InterlockedDecrement
static UINT add_stream(MSIDATABASE *db, const WCHAR *name, IStream *data)
static UINT read_table_int(BYTE *const *data, UINT row, UINT col, UINT bytes)
static UINT get_table(MSIDATABASE *db, LPCWSTR name, MSITABLE **table_ret)
static const WCHAR szDot[]
#define memcpy(s1, s2, n)
UINT msi_save_string_table(const string_table *st, IStorage *storage, UINT *bytes_per_strref) DECLSPEC_HIDDEN
static UINT TABLE_add_column(struct tagMSIVIEW *view, LPCWSTR table, UINT number, LPCWSTR column, UINT type, BOOL hold)
static UINT TABLE_modify(struct tagMSIVIEW *view, MSIMODIFY eModifyMode, MSIRECORD *rec, UINT row)
static UINT msi_table_assign(struct tagMSIVIEW *view, MSIRECORD *rec)
UINT MSI_RecordSetIStream(MSIRECORD *, UINT, IStream *) DECLSPEC_HIDDEN
#define ERROR_INVALID_DATA
static void msi_free_colinfo(MSICOLUMNINFO *colinfo, UINT count)
int MSI_RecordGetInteger(MSIRECORD *, UINT) DECLSPEC_HIDDEN
const WCHAR * msi_record_get_string(const MSIRECORD *, UINT, int *) DECLSPEC_HIDDEN
static UINT TABLE_set_int(MSITABLEVIEW *tv, UINT row, UINT col, UINT val)
#define ERROR_INVALID_TABLE
static void free_table(MSITABLE *table)
UINT(* delete)(struct tagMSIVIEW *)
__WINE_SERVER_LIST_INLINE int list_empty(const struct list *list)
_CRTIMP int __cdecl stat(const char *_Filename, struct stat *_Stat)
static unsigned __int64 next
#define InterlockedIncrement
static UINT TABLE_delete_row(struct tagMSIVIEW *view, UINT row)
static UINT TABLE_close(struct tagMSIVIEW *view)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
const WCHAR * error_column
#define MSITYPE_TEMPORARY
WCHAR * msi_dup_record_field(MSIRECORD *row, INT index) DECLSPEC_HIDDEN
MSICOLUMNHASHENTRY ** hash_table
static const WCHAR szProperty[]
UINT STREAMS_CreateView(MSIDATABASE *db, MSIVIEW **view) DECLSPEC_HIDDEN
#define FIELD_OFFSET(t, f)
BOOL decode_streamname(LPCWSTR in, LPWSTR out)
UINT msi_table_apply_transform(MSIDATABASE *db, IStorage *stg)
enum tagMSIMODIFY MSIMODIFY
UINT msi_record_set_string(MSIRECORD *, UINT, const WCHAR *, int) DECLSPEC_HIDDEN
static const WCHAR szStreams[]
UINT msi_view_get_row(MSIDATABASE *, MSIVIEW *, UINT, MSIRECORD **) DECLSPEC_HIDDEN
static UINT TABLE_release(struct tagMSIVIEW *view)
static const WCHAR szStringData[]
static BOOL msi_free(void *mem)
static const WCHAR szName[]
WINE_UNICODE_INLINE int strcmpW(const WCHAR *str1, const WCHAR *str2)
static UINT TABLE_fetch_int(struct tagMSIVIEW *view, UINT row, UINT col, UINT *val)
__WINE_SERVER_LIST_INLINE void list_init(struct list *list)
static void * msi_alloc(size_t len) __WINE_ALLOC_SIZE(1)
struct nls_table * tables
#define ERROR_CALL_NOT_IMPLEMENTED
GLuint GLenum GLenum transform
static UINT save_table(MSIDATABASE *db, const MSITABLE *t, UINT bytes_per_strref)
static UINT table_validate_new(MSITABLEVIEW *tv, MSIRECORD *rec, UINT *column)
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
GLenum GLenum GLvoid GLvoid * column
GLuint GLuint GLsizei GLenum type
struct tagMSICOLUMNINFO MSICOLUMNINFO
WINE_DEFAULT_DEBUG_CHANNEL(msidb)
static const WCHAR szType[]
#define ERROR_BAD_QUERY_SYNTAX
static MSITABLE * find_cached_table(MSIDATABASE *db, LPCWSTR name)
BOOL TABLE_Exists(MSIDATABASE *db, LPCWSTR name)
static const WCHAR szTable[]
UINT MSI_RecordGetFieldCount(const MSIRECORD *rec) DECLSPEC_HIDDEN
struct png_info_def *typedef unsigned char **typedef struct png_info_def *typedef struct png_info_def *typedef struct png_info_def *typedef unsigned char ** row
UINT(* insert_row)(struct tagMSIVIEW *view, MSIRECORD *record, UINT row, BOOL temporary)
static void msi_update_table_columns(MSIDATABASE *db, LPCWSTR name)
static int compare_record(MSITABLEVIEW *tv, UINT row, MSIRECORD *rec)
MSICONDITION MSI_DatabaseIsTablePersistent(MSIDATABASE *db, LPCWSTR table)
UINT MSI_DatabaseOpenViewW(MSIDATABASE *, LPCWSTR, MSIQUERY **) DECLSPEC_HIDDEN
GLuint const GLchar * name