22 RCSID(
"$Id: bcca53162492b0266ad3ead9cc3af66865ec7c38 $")
24 #include "sql_fbapi.h"
34 conn->
tpb = malloc(count);
36 for (i = 0; i < count; i++) {
37 conn->
tpb[i] = (char) va_arg(arg,
int);
59 memmove(*dpb, value, l);
67 for (i = 0; i < sqlda->sqld; i++) {
68 if ((sqlda->sqlvar[i].sqltype & ~1) == SQL_VARYING) {
69 sqlda->sqlvar[i].sqldata = (
char*)malloc(sqlda->sqlvar[i].sqllen +
sizeof(
short));
71 sqlda->sqlvar[i].sqldata = (
char*)malloc(sqlda->sqlvar[i].sqllen);
74 if (sqlda->sqlvar[i].sqltype & 1) {
75 sqlda->sqlvar[i].sqlind = (
short*)calloc(
sizeof(
short), 1);
77 sqlda->sqlvar[i].sqlind = 0;
85 ISC_SCHAR error[2048];
93 TALLOC_FREE(conn->error);
99 conn->sql_code = isc_sqlcode(conn->status);
106 pstatus = &conn->status[0];
115 isc_interprete(&error[0], &pstatus);
118 while (isc_interprete(&error[0], &pstatus)) {
119 conn->error = talloc_asprintf_append(conn->error,
"%s. ", &error[0]);
122 memset(&conn->status, 0,
sizeof(conn->status));
125 return conn->sql_code;
127 DIAG_ON(deprecated-declarations)
132 for (i = 0; i < sqlda->sqld; i++) {
133 free(sqlda->sqlvar[i].sqldata);
134 free(sqlda->sqlvar[i].sqlind);
142 #define IS_NULL(x) (x->sqltype & 1) && (*x->sqlind < 0)
164 conn->
row = (
char **) realloc(conn->
row, conn->
row_fcount *
sizeof(
char *));
167 while( i <conn->row_fcount) {
173 for (i = 0, var = conn->
sqlda_out->sqlvar; i < conn->sqlda_out->sqld; var++, i++) {
178 conn->
row[i] = (
char *) realloc(conn->
row[i], 256);
183 strcpy(conn->
row[i],
"NULL");
187 dtype = var->sqltype & ~1;
193 conn->
row[i] = realloc(conn->
row[i],
197 memmove(conn->
row[i], var->sqldata, var->sqllen);
198 conn->
row[i][var->sqllen] = 0;
202 vary = (
VARY*) var->sqldata;
205 conn->
row[i] = realloc(conn->
row[i],
214 *(
float ISC_FAR *) (var->sqldata));
222 short field_width = 0;
229 value = (ISC_INT64) *(
short *)var->sqldata;
234 value = (ISC_INT64) *(
int *)var->sqldata;
239 value = (ISC_INT64) *(ISC_INT64 *)var->sqldata;
243 dscale = var->sqlscale;
250 for (j = 0; j > dscale; j--) {
255 sprintf(p,
"%*lld.%0*lld",
256 field_width - 1 + dscale,
257 (ISC_INT64) value / tens,
259 (ISC_INT64) value % tens);
260 }
else if ((value / tens) != 0) {
261 sprintf (p,
"%*lld.%0*lld",
262 field_width - 1 + dscale,
263 (ISC_INT64) (value / tens),
265 (ISC_INT64) -(value % tens));
267 sprintf(p,
"%*s.%0*lld", field_width - 1 + dscale,
268 "-0", -dscale, (ISC_INT64) - (value % tens));
271 sprintf(p,
"%*lld%0*d", field_width,
272 (ISC_INT64) value, dscale, 0);
274 sprintf(p,
"%*lld", field_width,
283 *(
double ISC_FAR *) (var->sqldata));
287 isc_decode_timestamp((ISC_TIMESTAMP ISC_FAR *)var->sqldata, ×);
289 times.tm_year + 1900,
295 ((ISC_TIMESTAMP *)var->sqldata)->timestamp_time % 10000);
299 isc_decode_sql_date((ISC_DATE ISC_FAR *)var->sqldata, ×);
301 times.tm_year + 1900,
307 isc_decode_sql_time((ISC_TIME ISC_FAR *)var->sqldata, ×);
312 (*((ISC_TIME *)var->sqldata)) % 10000);
318 bid = *(ISC_QUAD ISC_FAR *) var->sqldata;
320 bid.gds_quad_high, bid.gds_quad_low);
328 memset(conn, 0,
sizeof(*conn));
329 conn->
sqlda_out = (XSQLDA ISC_FAR *) calloc(XSQLDA_LENGTH (5), 1);
331 conn->
sqlda_out->version = SQLDA_VERSION1;
335 DEBUG(
"Init mutex %p\n", &conn->mut);
341 fb_set_tpb(conn, 5, isc_tpb_version3, isc_tpb_wait, isc_tpb_write,
342 isc_tpb_read_committed, isc_tpb_no_rec_version);
367 *conn->
dpb++= isc_dpb_version1;
368 *conn->
dpb++= isc_dpb_num_buffers;
390 int ld = strlen(config->
sql_db);
391 database = (
char *) calloc(ls + ld + 2, 1);
394 memmove(database + ls + 1, config->
sql_db, ld);
396 isc_attach_database(conn->
status, 0, database, &conn->
dbh,
411 fetch_stat = isc_dsql_fetch(conn->
status, &conn->
stmt,
414 if (fetch_stat!= 100L) {
426 static char stmt_info[] = { isc_info_sql_stmt_type };
427 char info_buffer[128];
431 isc_start_transaction(conn->
status, &conn->
trh, 1, &conn->
dbh,
440 isc_dsql_allocate_statement(conn->
status, &conn->
dbh,
448 isc_dsql_prepare(conn->
status, &conn->
trh, &conn->
stmt, 0, query,
458 isc_dsql_describe(conn->
status, &conn->
stmt, SQL_DIALECT_V6,
468 isc_dsql_sql_info(conn->
status, &conn->
stmt,
sizeof(stmt_info),
469 stmt_info,
sizeof(info_buffer), info_buffer);
472 l = (short) isc_vax_integer((
char ISC_FAR *) info_buffer + 1, 2);
473 conn->
statement_type = isc_vax_integer((
char ISC_FAR *) info_buffer + 3,
490 case isc_info_sql_stmt_exec_procedure:
504 static char count_info[] = {isc_info_sql_records};
505 char info_buffer[128];
509 if (!conn->
stmt)
return -1;
512 sizeof (count_info), count_info,
513 sizeof (info_buffer), info_buffer);
520 while (*p != isc_info_end) {
522 short len = (short)isc_vax_integer(p, 2);
525 affected_rows = isc_vax_integer(p, len);
526 if (affected_rows > 0) {
535 isc_dsql_free_statement(conn->
status, &conn->
stmt, DSQL_close);
542 isc_dsql_free_statement(conn->
status, &conn->
stmt, DSQL_drop);
550 isc_rollback_transaction(conn->
status, &conn->
trh);
566 isc_commit_transaction (conn->
status, &conn->
trh);
569 ERROR(
"Fail to commit. Error: %s. Try to rollback.", conn->
error);
#define pthread_mutex_init(_x, _y)
static int fb_prepare(rlm_sql_firebird_conn_t *conn, char const *query)
int fb_sql_query(rlm_sql_firebird_conn_t *conn, char const *query)
int fb_close_cursor(rlm_sql_firebird_conn_t *conn)
char const * sql_server
Server to connect to.
PUBLIC int snprintf(char *string, size_t length, char *format, va_alist)
int fb_fetch(rlm_sql_firebird_conn_t *conn)
void fb_store_row(rlm_sql_firebird_conn_t *conn)
static void fb_set_tpb(rlm_sql_firebird_conn_t *conn, int count,...)
int fb_commit(rlm_sql_firebird_conn_t *conn)
int fb_init_socket(rlm_sql_firebird_conn_t *conn)
#define IS_ISC_ERROR(status)
int fb_affected_rows(rlm_sql_firebird_conn_t *conn)
#define pthread_mutex_unlock(_x)
int fb_connect(rlm_sql_firebird_conn_t *conn, rlm_sql_config_t *config)
static void fb_set_sqlda(XSQLDA *sqlda)
static void fb_dpb_add_str(char **dpb, char name, char const *value)
char * talloc_typed_asprintf(void const *t, char const *fmt,...)
Call talloc vasprintf, setting the type on the new chunk correctly.
char const * sql_password
Login password to use.
void fb_free_sqlda(XSQLDA *sqlda)
char const * sql_login
Login credentials to use.
int fb_error(rlm_sql_firebird_conn_t *conn)
int fb_rollback(rlm_sql_firebird_conn_t *conn)
void fb_free_statement(rlm_sql_firebird_conn_t *conn)
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...
char const * sql_db
Database to run queries against.
ISC_STATUS status[20]
Magic interbase status code array (holds multiple error codes used to construct more detailed error m...