ReactOS 0.4.16-dev-125-g798ea90
distinct.c File Reference
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "winerror.h"
#include "wine/debug.h"
#include "msi.h"
#include "msiquery.h"
#include "objbase.h"
#include "objidl.h"
#include "msipriv.h"
#include "winnls.h"
#include "query.h"
Include dependency graph for distinct.c:

Go to the source code of this file.

Classes

struct  distinct_set
 
struct  distinct_view
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (msidb)
 
static struct distinct_set ** distinct_insert (struct distinct_set **x, UINT val, UINT row)
 
static void distinct_free (struct distinct_set *x)
 
static UINT DISTINCT_fetch_int (struct tagMSIVIEW *view, UINT row, UINT col, UINT *val)
 
static UINT DISTINCT_execute (struct tagMSIVIEW *view, MSIRECORD *record)
 
static UINT DISTINCT_close (struct tagMSIVIEW *view)
 
static UINT DISTINCT_get_dimensions (struct tagMSIVIEW *view, UINT *rows, UINT *cols)
 
static UINT DISTINCT_get_column_info (struct tagMSIVIEW *view, UINT n, LPCWSTR *name, UINT *type, BOOL *temporary, LPCWSTR *table_name)
 
static UINT DISTINCT_modify (struct tagMSIVIEW *view, MSIMODIFY eModifyMode, MSIRECORD *rec, UINT row)
 
static UINT DISTINCT_delete (struct tagMSIVIEW *view)
 
UINT DISTINCT_CreateView (MSIDATABASE *db, MSIVIEW **view, MSIVIEW *table)
 

Variables

static const MSIVIEWOPS distinct_ops
 

Function Documentation

◆ DISTINCT_close()

static UINT DISTINCT_close ( struct tagMSIVIEW view)
static

Definition at line 172 of file distinct.c.

173{
174 struct distinct_view *dv = (struct distinct_view *)view;
175
176 TRACE("%p\n", dv );
177
178 if( !dv->table )
180
181 free( dv->translation );
182 dv->translation = NULL;
183 dv->row_count = 0;
184
185 return dv->table->ops->close( dv->table );
186}
#define free
Definition: debug_ros.c:5
#define NULL
Definition: types.h:112
#define TRACE(s)
Definition: solgame.cpp:4
UINT row_count
Definition: distinct.c:52
MSIVIEW * table
Definition: distinct.c:51
UINT * translation
Definition: distinct.c:53
UINT(* close)(struct tagMSIVIEW *view)
Definition: msipriv.h:298
const MSIVIEWOPS * ops
Definition: msipriv.h:355
#define ERROR_FUNCTION_FAILED
Definition: winerror.h:985

◆ DISTINCT_CreateView()

UINT DISTINCT_CreateView ( MSIDATABASE db,
MSIVIEW **  view,
MSIVIEW table 
)

Definition at line 273 of file distinct.c.

274{
275 struct distinct_view *dv = NULL;
276 UINT count = 0, r;
277
278 TRACE("%p\n", dv );
279
280 r = table->ops->get_dimensions( table, NULL, &count );
281 if( r != ERROR_SUCCESS )
282 {
283 ERR("can't get table dimensions\n");
284 return r;
285 }
286
287 dv = calloc( 1, sizeof *dv );
288 if( !dv )
290
291 /* fill the structure */
292 dv->view.ops = &distinct_ops;
293 msiobj_addref( &db->hdr );
294 dv->db = db;
295 dv->table = table;
296 dv->translation = NULL;
297 dv->row_count = 0;
298 *view = (MSIVIEW*) dv;
299
300 return ERROR_SUCCESS;
301}
#define ERR(fmt,...)
Definition: precomp.h:57
#define ERROR_SUCCESS
Definition: deptool.c:10
static const MSIVIEWOPS distinct_ops
Definition: distinct.c:250
void msiobj_addref(MSIOBJECTHDR *info)
Definition: handle.c:217
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
unsigned int UINT
Definition: ndis.h:50
#define calloc
Definition: rosglue.h:14
MSIVIEW view
Definition: distinct.c:49
MSIDATABASE * db
Definition: distinct.c:50
MSIOBJECTHDR hdr
Definition: msipriv.h:108

◆ DISTINCT_delete()

static UINT DISTINCT_delete ( struct tagMSIVIEW view)
static

Definition at line 234 of file distinct.c.

235{
236 struct distinct_view *dv = (struct distinct_view *)view;
237
238 TRACE("%p\n", dv );
239
240 if( dv->table )
241 dv->table->ops->delete( dv->table );
242
243 free( dv->translation );
244 msiobj_release( &dv->db->hdr );
245 free( dv );
246
247 return ERROR_SUCCESS;
248}
int msiobj_release(MSIOBJECTHDR *info)
Definition: handle.c:241
UINT(* delete)(struct tagMSIVIEW *)
Definition: msipriv.h:324

◆ DISTINCT_execute()

static UINT DISTINCT_execute ( struct tagMSIVIEW view,
MSIRECORD record 
)
static

Definition at line 110 of file distinct.c.

111{
112 struct distinct_view *dv = (struct distinct_view *)view;
113 UINT r, i, j, r_count, c_count;
114 struct distinct_set *rowset = NULL;
115
116 TRACE("%p %p\n", dv, record);
117
118 if( !dv->table )
120
121 r = dv->table->ops->execute( dv->table, record );
122 if( r != ERROR_SUCCESS )
123 return r;
124
125 r = dv->table->ops->get_dimensions( dv->table, &r_count, &c_count );
126 if( r != ERROR_SUCCESS )
127 return r;
128
129 dv->translation = malloc( r_count * sizeof(UINT) );
130 if( !dv->translation )
132
133 /* build it */
134 for( i=0; i<r_count; i++ )
135 {
136 struct distinct_set **x = &rowset;
137
138 for( j=1; j<=c_count; j++ )
139 {
140 UINT val = 0;
141 r = dv->table->ops->fetch_int( dv->table, i, j, &val );
142 if( r != ERROR_SUCCESS )
143 {
144 ERR("Failed to fetch int at %d %d\n", i, j );
145 distinct_free( rowset );
146 return r;
147 }
148 x = distinct_insert( x, val, i );
149 if( !*x )
150 {
151 ERR("Failed to insert at %d %d\n", i, j );
152 distinct_free( rowset );
154 }
155 if( j != c_count )
156 x = &(*x)->nextcol;
157 }
158
159 /* check if it was distinct and if so, include it */
160 if( (*x)->row == i )
161 {
162 TRACE("Row %d -> %d\n", dv->row_count, i);
163 dv->translation[dv->row_count++] = i;
164 }
165 }
166
167 distinct_free( rowset );
168
169 return ERROR_SUCCESS;
170}
#define malloc
Definition: debug_ros.c:4
static struct distinct_set ** distinct_insert(struct distinct_set **x, UINT val, UINT row)
Definition: distinct.c:56
static void distinct_free(struct distinct_set *x)
Definition: distinct.c:82
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLuint GLfloat * val
Definition: glext.h:7180
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
Definition: glfuncs.h:248
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
Definition: glfuncs.h:250
UINT(* fetch_int)(struct tagMSIVIEW *view, UINT row, UINT col, UINT *val)
Definition: msipriv.h:242
UINT(* get_dimensions)(struct tagMSIVIEW *view, UINT *rows, UINT *cols)
Definition: msipriv.h:306
UINT(* execute)(struct tagMSIVIEW *view, MSIRECORD *record)
Definition: msipriv.h:293

◆ DISTINCT_fetch_int()

static UINT DISTINCT_fetch_int ( struct tagMSIVIEW view,
UINT  row,
UINT  col,
UINT val 
)
static

Definition at line 93 of file distinct.c.

94{
95 struct distinct_view *dv = (struct distinct_view *)view;
96
97 TRACE("%p %d %d %p\n", dv, row, col, val );
98
99 if( !dv->table )
101
102 if( row >= dv->row_count )
104
105 row = dv->translation[ row ];
106
107 return dv->table->ops->fetch_int( dv->table, row, col, val );
108}
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
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
Definition: typeof.h:78

◆ distinct_free()

static void distinct_free ( struct distinct_set x)
static

Definition at line 82 of file distinct.c.

83{
84 while( x )
85 {
86 struct distinct_set *next = x->nextrow;
87 distinct_free( x->nextcol );
88 free( x );
89 x = next;
90 }
91}
static unsigned __int64 next
Definition: rand_nt.c:6

Referenced by DISTINCT_execute(), and distinct_free().

◆ DISTINCT_get_column_info()

static UINT DISTINCT_get_column_info ( struct tagMSIVIEW view,
UINT  n,
LPCWSTR name,
UINT type,
BOOL temporary,
LPCWSTR table_name 
)
static

Definition at line 207 of file distinct.c.

209{
210 struct distinct_view *dv = (struct distinct_view *)view;
211
212 TRACE("%p %d %p %p %p %p\n", dv, n, name, type, temporary, table_name );
213
214 if( !dv->table )
216
217 return dv->table->ops->get_column_info( dv->table, n, name,
218 type, temporary, table_name );
219}
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLdouble n
Definition: glext.h:7729
Definition: name.c:39
UINT(* get_column_info)(struct tagMSIVIEW *view, UINT n, LPCWSTR *name, UINT *type, BOOL *temporary, LPCWSTR *table_name)
Definition: msipriv.h:313

◆ DISTINCT_get_dimensions()

static UINT DISTINCT_get_dimensions ( struct tagMSIVIEW view,
UINT rows,
UINT cols 
)
static

Definition at line 188 of file distinct.c.

189{
190 struct distinct_view *dv = (struct distinct_view *)view;
191
192 TRACE("%p %p %p\n", dv, rows, cols );
193
194 if( !dv->table )
196
197 if( rows )
198 {
199 if( !dv->translation )
201 *rows = dv->row_count;
202 }
203
204 return dv->table->ops->get_dimensions( dv->table, NULL, cols );
205}

◆ distinct_insert()

static struct distinct_set ** distinct_insert ( struct distinct_set **  x,
UINT  val,
UINT  row 
)
static

Definition at line 56 of file distinct.c.

57{
58 /* horrible O(n) find */
59 while( *x )
60 {
61 if( (*x)->val == val )
62 {
63 (*x)->count++;
64 return x;
65 }
66 x = &(*x)->nextrow;
67 }
68
69 /* nothing found, so add one */
70 *x = malloc( sizeof(**x) );
71 if( *x )
72 {
73 (*x)->val = val;
74 (*x)->count = 1;
75 (*x)->row = row;
76 (*x)->nextrow = NULL;
77 (*x)->nextcol = NULL;
78 }
79 return x;
80}

Referenced by DISTINCT_execute().

◆ DISTINCT_modify()

static UINT DISTINCT_modify ( struct tagMSIVIEW view,
MSIMODIFY  eModifyMode,
MSIRECORD rec,
UINT  row 
)
static

Definition at line 221 of file distinct.c.

223{
224 struct distinct_view *dv = (struct distinct_view *)view;
225
226 TRACE("%p %d %p\n", dv, eModifyMode, rec );
227
228 if( !dv->table )
230
231 return dv->table->ops->modify( dv->table, eModifyMode, rec, row );
232}
UINT(* modify)(struct tagMSIVIEW *view, MSIMODIFY eModifyMode, MSIRECORD *record, UINT row)
Definition: msipriv.h:319

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( msidb  )

Variable Documentation

◆ distinct_ops

const MSIVIEWOPS distinct_ops
static
Initial value:
=
{
}
static UINT DISTINCT_execute(struct tagMSIVIEW *view, MSIRECORD *record)
Definition: distinct.c:110
static UINT DISTINCT_close(struct tagMSIVIEW *view)
Definition: distinct.c:172
static UINT DISTINCT_fetch_int(struct tagMSIVIEW *view, UINT row, UINT col, UINT *val)
Definition: distinct.c:93
static UINT DISTINCT_get_column_info(struct tagMSIVIEW *view, UINT n, LPCWSTR *name, UINT *type, BOOL *temporary, LPCWSTR *table_name)
Definition: distinct.c:207
static UINT DISTINCT_delete(struct tagMSIVIEW *view)
Definition: distinct.c:234
static UINT DISTINCT_modify(struct tagMSIVIEW *view, MSIMODIFY eModifyMode, MSIRECORD *rec, UINT row)
Definition: distinct.c:221
static UINT DISTINCT_get_dimensions(struct tagMSIVIEW *view, UINT *rows, UINT *cols)
Definition: distinct.c:188

Definition at line 250 of file distinct.c.

Referenced by DISTINCT_CreateView().