138 |
} |
} |
139 |
|
|
140 |
static void |
static void |
141 |
rad_odbc_disconnect(struct sql_connection *conn, |
rad_odbc_disconnect(struct sql_connection *conn, int drop ARG_UNUSED) |
|
int drop /* currently unused */) |
|
142 |
{ |
{ |
143 |
ODBCconn *odata; |
ODBCconn *odata; |
144 |
if (!conn->data) |
if (!conn->data) |
262 |
} |
} |
263 |
|
|
264 |
typedef struct { |
typedef struct { |
265 |
void *stmt; |
SQLHSTMT stmt; |
266 |
int nfields; |
int nfields; |
267 |
|
int ntuples; |
268 |
} EXEC_DATA; |
} EXEC_DATA; |
269 |
|
|
270 |
|
static int |
271 |
|
rad_odbc_n_columns(struct sql_connection *conn, void *data, size_t *np) |
272 |
|
{ |
273 |
|
EXEC_DATA *edata = (EXEC_DATA*)data; |
274 |
|
|
275 |
|
if (!data) |
276 |
|
return -1; |
277 |
|
*np = edata->nfields; |
278 |
|
return 0; |
279 |
|
} |
280 |
|
|
281 |
|
static int |
282 |
|
rad_odbc_n_tuples(struct sql_connection *conn, void *data, size_t *np) |
283 |
|
{ |
284 |
|
EXEC_DATA *edata = (EXEC_DATA*)data; |
285 |
|
|
286 |
|
if (!data) |
287 |
|
return -1; |
288 |
|
*np = edata->ntuples; |
289 |
|
return 0; |
290 |
|
} |
291 |
|
|
292 |
static void * |
static void * |
293 |
rad_odbc_exec(struct sql_connection *conn, char *query) |
rad_odbc_exec(struct sql_connection *conn, char *query) |
294 |
{ |
{ |
297 |
long result; |
long result; |
298 |
SQLHSTMT stmt; |
SQLHSTMT stmt; |
299 |
SQLSMALLINT ccount; |
SQLSMALLINT ccount; |
300 |
|
SQLINTEGER rcount; |
301 |
EXEC_DATA *data; |
EXEC_DATA *data; |
302 |
|
|
303 |
if (!conn || !conn->data) |
if (!conn || !conn->data) |
305 |
|
|
306 |
debug(1, ("query: %s", query)); |
debug(1, ("query: %s", query)); |
307 |
|
|
308 |
odata = (ODBCconn*)(conn->data); |
odata = (ODBCconn*)conn->data; |
309 |
result = SQLAllocHandle(SQL_HANDLE_STMT,odata->dbc, &stmt); |
result = SQLAllocHandle(SQL_HANDLE_STMT,odata->dbc, &stmt); |
310 |
if (result != SQL_SUCCESS) { |
if (result != SQL_SUCCESS) { |
311 |
rad_odbc_diag(SQL_HANDLE_DBC, odata->dbc, |
rad_odbc_diag(SQL_HANDLE_DBC, odata->dbc, |
321 |
return NULL; |
return NULL; |
322 |
} |
} |
323 |
|
|
324 |
result = SQLNumResultCols(stmt, &ccount); |
if (SQLNumResultCols(stmt, &ccount) != SQL_SUCCESS |
325 |
if (result != SQL_SUCCESS) { |
|| SQLRowCount(stmt, &rcount) != SQL_SUCCESS) { |
326 |
rad_odbc_diag(SQL_HANDLE_STMT, stmt, |
rad_odbc_diag(SQL_HANDLE_STMT, stmt, |
327 |
"SQLNumResultCount"); |
"SQLNumResultCount"); |
328 |
SQLFreeHandle(SQL_HANDLE_STMT, stmt); |
SQLFreeHandle(SQL_HANDLE_STMT, stmt); |
329 |
return NULL; |
return NULL; |
330 |
} |
} |
331 |
|
|
332 |
|
if (rcount == 0) { |
333 |
|
SQLFreeHandle(SQL_HANDLE_STMT, stmt); |
334 |
|
return NULL; |
335 |
|
} |
336 |
|
|
337 |
|
|
338 |
data = emalloc(sizeof(*data)); |
data = emalloc(sizeof(*data)); |
339 |
data->stmt = stmt; |
data->stmt = stmt; |
340 |
data->nfields = ccount; |
data->nfields = ccount; |
341 |
|
data->ntuples = rcount; |
342 |
return (void*)data; |
return (void*)data; |
343 |
} |
} |
344 |
|
|
389 |
rad_odbc_diag(SQL_HANDLE_STMT, edata->stmt, |
rad_odbc_diag(SQL_HANDLE_STMT, edata->stmt, |
390 |
"SQLFetch"); |
"SQLFetch"); |
391 |
return 1; |
return 1; |
|
|
|
|
|
|
392 |
} |
} |
393 |
|
|
394 |
/*ARGSUSED*/ |
/*ARGSUSED*/ |
414 |
rad_odbc_exec, |
rad_odbc_exec, |
415 |
rad_odbc_column, |
rad_odbc_column, |
416 |
rad_odbc_next_tuple, |
rad_odbc_next_tuple, |
417 |
rad_odbc_free |
rad_odbc_free, |
418 |
|
rad_odbc_n_tuples, |
419 |
|
rad_odbc_n_columns, |
420 |
}; |
}; |
421 |
|
|
422 |
#endif |
#endif |