22 RCSID(
"$Id: 27828e85c9afc01060131c650faa836c3a01ab40 $")
24 #include "sql_fbapi.h"
36 for (i = 0; i <
count; i++) conn->
tpb[i] = (
char) va_arg(arg,
int);
57 memmove(*dpb,
value, l);
65 for (i = 0; i < sqlda->sqld; i++) {
66 if ((sqlda->sqlvar[i].sqltype & ~1) == SQL_VARYING) {
67 MEM(sqlda->sqlvar[i].sqldata = (
char*)malloc(sqlda->sqlvar[i].sqllen +
sizeof(
short)));
69 MEM(sqlda->sqlvar[i].sqldata = (
char*)malloc(sqlda->sqlvar[i].sqllen));
72 if (sqlda->sqlvar[i].sqltype & 1) {
73 MEM(sqlda->sqlvar[i].sqlind = (
short*)calloc(
sizeof(
short), 1));
75 sqlda->sqlvar[i].sqlind = 0;
83 ISC_SCHAR error[2048];
91 TALLOC_FREE(conn->error);
97 conn->sql_code = isc_sqlcode(conn->status);
104 pstatus = &conn->status[0];
113 isc_interprete(&error[0], &pstatus);
116 while (isc_interprete(&error[0], &pstatus)) {
117 conn->error = talloc_asprintf_append(conn->error,
"%s. ", &error[0]);
120 memset(&conn->status, 0,
sizeof(conn->status));
123 return conn->sql_code;
125 DIAG_ON(deprecated-declarations)
130 for (i = 0; i < sqlda->sqld; i++) {
131 free(sqlda->sqlvar[i].sqldata);
132 free(sqlda->sqlvar[i].sqlind);
140 #define IS_NULL(x) (x->sqltype & 1) && (*x->sqlind < 0)
162 conn->
row = (
char **) realloc(conn->
row, conn->
row_fcount *
sizeof(
char *));
165 while( i <conn->row_fcount) {
171 for (i = 0, var = conn->
sqlda_out->sqlvar; i < conn->sqlda_out->sqld; var++, i++) {
176 conn->
row[i] = (
char *) realloc(conn->
row[i], 256);
185 dtype = var->sqltype & ~1;
191 conn->
row[i] = realloc(conn->
row[i],
195 memmove(conn->
row[i], var->sqldata, var->sqllen);
196 conn->
row[i][var->sqllen] = 0;
200 vary = (
VARY*) var->sqldata;
203 conn->
row[i] = realloc(conn->
row[i],
212 *(
double ISC_FAR *) (var->sqldata));
220 short field_width = 0;
225 value = (ISC_INT64) *(
short *)var->sqldata;
230 value = (ISC_INT64) *(
int *)var->sqldata;
235 value = (ISC_INT64) *(ISC_INT64 *)var->sqldata;
239 dscale = var->sqlscale;
246 for (j = 0; j > dscale; j--) {
252 field_width - 1 + dscale,
253 (ISC_INT64)
value / tens,
255 (ISC_INT64)
value % tens);
256 }
else if ((
value / tens) != 0) {
258 field_width - 1 + dscale,
259 (ISC_INT64) (
value / tens),
261 (ISC_INT64) -(
value % tens));
264 "-0", -dscale, (ISC_INT64) - (
value % tens));
268 (ISC_INT64)
value, dscale, 0);
279 *(
double ISC_FAR *) (var->sqldata));
283 isc_decode_timestamp((ISC_TIMESTAMP ISC_FAR *)var->sqldata, ×);
285 times.tm_year + 1900,
291 ((ISC_TIMESTAMP *)var->sqldata)->timestamp_time % 10000);
295 isc_decode_sql_date((ISC_DATE ISC_FAR *)var->sqldata, ×);
297 times.tm_year + 1900,
303 isc_decode_sql_time((ISC_TIME ISC_FAR *)var->sqldata, ×);
308 (*((ISC_TIME *)var->sqldata)) % 10000);
314 bid = *(ISC_QUAD ISC_FAR *) var->sqldata;
316 bid.gds_quad_high, bid.gds_quad_low);
324 memset(conn, 0,
sizeof(*conn));
325 MEM(conn->
sqlda_out = (XSQLDA ISC_FAR *) calloc(XSQLDA_LENGTH (5), 1));
327 conn->
sqlda_out->version = SQLDA_VERSION1;
330 pthread_mutex_init (&conn->
mut, NULL);
331 DEBUG(
"Init mutex %p\n", &conn->
mut);
336 fb_set_tpb(conn, 5, isc_tpb_version3, isc_tpb_wait, isc_tpb_write,
337 isc_tpb_read_committed, isc_tpb_no_rec_version);
355 if (
config->sql_password) {
362 *conn->
dpb++= isc_dpb_version1;
363 *conn->
dpb++= isc_dpb_num_buffers;
377 if (strchr(
config->sql_server,
':')) {
378 database = strdup(
config->sql_server);
384 int ls = strlen(
config->sql_server);
385 int ld = strlen(
config->sql_db);
386 MEM(database = (
char *) calloc(ls + ld + 2, 1));
389 memmove(database + ls + 1,
config->sql_db, ld);
391 isc_attach_database(conn->
status, 0, database, &conn->
dbh,
406 fetch_stat = isc_dsql_fetch(conn->
status, &conn->
stmt,
409 if (fetch_stat!= 100L) {
421 static char stmt_info[] = { isc_info_sql_stmt_type };
422 char info_buffer[128];
426 isc_start_transaction(conn->
status, &conn->
trh, 1, &conn->
dbh,
435 isc_dsql_allocate_statement(conn->
status, &conn->
dbh,
443 isc_dsql_prepare(conn->
status, &conn->
trh, &conn->
stmt, 0, query,
453 isc_dsql_describe(conn->
status, &conn->
stmt, SQL_DIALECT_V6,
463 isc_dsql_sql_info(conn->
status, &conn->
stmt,
sizeof(stmt_info),
464 stmt_info,
sizeof(info_buffer), info_buffer);
467 l = (short) isc_vax_integer((
char ISC_FAR *) info_buffer + 1, 2);
468 conn->
statement_type = isc_vax_integer((
char ISC_FAR *) info_buffer + 3,
485 case isc_info_sql_stmt_exec_procedure:
499 static char count_info[] = {isc_info_sql_records};
500 char info_buffer[128];
504 if (!conn->
stmt)
return -1;
507 sizeof (count_info), count_info,
508 sizeof (info_buffer), info_buffer);
515 while (*p != isc_info_end) {
518 short len = (short)isc_vax_integer(p, 2);
532 isc_dsql_free_statement(conn->
status, &conn->
stmt, DSQL_close);
539 isc_dsql_free_statement(conn->
status, &conn->
stmt, DSQL_drop);
547 isc_rollback_transaction(conn->
status, &conn->
trh);
549 pthread_mutex_unlock(&conn->
mut);
561 isc_commit_transaction(conn->
status, &conn->
trh);
564 ERROR(
"Fail to commit. Error: %s. Try to rollback.", conn->
error);
569 pthread_mutex_unlock(&conn->
mut);
strcpy(log_entry->msg, buffer)
static const conf_parser_t config[]
static int affected_rows(PGresult *result)
Return the number of affected rows of the result as an int instead of the string that postgresql prov...
PUBLIC int snprintf(char *string, size_t length, char *format, va_alist)
int fb_init_socket(rlm_sql_firebird_conn_t *conn)
static void fb_dpb_add_str(char **dpb, char name, char const *value)
int fb_sql_query(rlm_sql_firebird_conn_t *conn, char const *query)
void fb_store_row(rlm_sql_firebird_conn_t *conn)
int fb_connect(rlm_sql_firebird_conn_t *conn, rlm_sql_config_t const *config)
static void fb_set_sqlda(XSQLDA *sqlda)
int fb_rollback(rlm_sql_firebird_conn_t *conn)
int fb_error(rlm_sql_firebird_conn_t *conn)
int fb_fetch(rlm_sql_firebird_conn_t *conn)
int fb_close_cursor(rlm_sql_firebird_conn_t *conn)
void fb_free_sqlda(XSQLDA *sqlda)
static int fb_prepare(rlm_sql_firebird_conn_t *conn, char const *query)
static void fb_set_tpb(rlm_sql_firebird_conn_t *conn, int count,...)
int fb_commit(rlm_sql_firebird_conn_t *conn)
int fb_affected_rows(rlm_sql_firebird_conn_t *conn)
void fb_free_statement(rlm_sql_firebird_conn_t *conn)
#define IS_ISC_ERROR(status)
ISC_STATUS status[20]
Magic interbase status code array (holds multiple error codes used to construct more detailed error m...
if(!subtype_vp) goto fail
MEM(pair_append_request(&vp, attr_eap_aka_sim_identity) >=0)
char * talloc_typed_asprintf(TALLOC_CTX *ctx, char const *fmt,...)
Call talloc vasprintf, setting the type on the new chunk correctly.