static int odbc_log(struct ast_cdr *cdr) { struct odbc_obj *obj = ast_odbc_request_obj(dsn, 0); SQLHSTMT stmt; if (!obj) { ast_log(LOG_ERROR, "Unable to retrieve database handle. CDR failed.\n"); return -1; } stmt = ast_odbc_direct_execute(obj, execute_cb, cdr); if (stmt) { SQLLEN rows = 0; SQLRowCount(stmt, &rows); SQLFreeHandle(SQL_HANDLE_STMT, stmt); if (rows == 0) ast_log(LOG_WARNING, "CDR successfully ran, but inserted 0 rows?\n"); } else ast_log(LOG_ERROR, "CDR direct execute failed\n"); ast_odbc_release_obj(obj); return 0; }
static void retrieve_file(char *dir) { int x = 0; int res; int fd=-1; size_t fdlen = 0; void *fdm = MAP_FAILED; SQLHSTMT stmt; char sql[256]; char fmt[80]="", empty[10] = ""; char *c; SQLLEN colsize; char full_fn[256]; struct odbc_obj *obj; struct generic_prepare_struct gps = { .sql = sql, .param = dir }; obj = ast_odbc_request_obj(odbc_database, 1); if (obj) { do { ast_copy_string(fmt, vmfmts, sizeof(fmt)); c = strchr(fmt, '|'); if (c) *c = '\0'; if (!strcasecmp(fmt, "wav49")) strcpy(fmt, "WAV"); snprintf(full_fn, sizeof(full_fn), "%s.%s", dir, fmt); snprintf(sql, sizeof(sql), "SELECT recording FROM %s WHERE dir=? AND msgnum=-1", odbc_table); stmt = ast_odbc_prepare_and_execute(obj, generic_prepare, &gps); if (!stmt) { ast_log(LOG_WARNING, "SQL Execute error!\n[%s]\n\n", sql); break; } res = SQLFetch(stmt); if (res == SQL_NO_DATA) { SQLFreeHandle(SQL_HANDLE_STMT, stmt); break; } else if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { ast_log(LOG_WARNING, "SQL Fetch error!\n[%s]\n\n", sql); SQLFreeHandle(SQL_HANDLE_STMT, stmt); break; } fd = open(full_fn, O_RDWR | O_CREAT | O_TRUNC, 0770); if (fd < 0) { ast_log(LOG_WARNING, "Failed to write '%s': %s\n", full_fn, strerror(errno)); SQLFreeHandle(SQL_HANDLE_STMT, stmt); break; } res = SQLGetData(stmt, 1, SQL_BINARY, empty, 0, &colsize); fdlen = colsize; if (fd > -1) { char tmp[1]=""; lseek(fd, fdlen - 1, SEEK_SET); if (write(fd, tmp, 1) != 1) { close(fd); fd = -1; break; } if (fd > -1) fdm = mmap(NULL, fdlen, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); } if (fdm != MAP_FAILED) { memset(fdm, 0, fdlen); res = SQLGetData(stmt, x + 1, SQL_BINARY, fdm, fdlen, &colsize); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { ast_log(LOG_WARNING, "SQL Get Data error!\n[%s]\n\n", sql); SQLFreeHandle(SQL_HANDLE_STMT, stmt); break; } } SQLFreeHandle(SQL_HANDLE_STMT, stmt); } while (0); ast_odbc_release_obj(obj); } else ast_log(LOG_WARNING, "Failed to obtain database object for '%s'!\n", odbc_database); if (fdm != MAP_FAILED) munmap(fdm, fdlen); if (fd > -1) close(fd); return; }