Hunk #1: Patch to fallback to FreeTDS 0.95-ish define to unbreak build with newer FreeTDS. Learn about the 8.0 mess in http://www.freetds.org/userguide/choosingtdsprotocol.htm Some? of the others: From FreeBSD. Index: drivers/freetds/dbd_freetds.c --- drivers/freetds/dbd_freetds.c.orig +++ drivers/freetds/dbd_freetds.c @@ -233,7 +233,11 @@ int dbd_connect(dbi_conn_t * conn) switch (str[0]) { // We can use it if "CS_TDS_80" will be add to ct_con_props() by CS_SET action case '8': +#ifdef CS_TDS_80 num = CS_TDS_80; +#else + num = CS_TDS_71; +#endif break; case '7': num = CS_TDS_70; @@ -474,6 +478,7 @@ dbi_result_t *dbd_list_tables(dbi_conn_t * conn, const { dbi_result_t *res; char *sql_cmd; + char *current_db = NULL; if (db == NULL || db[0] == '\0') { /* Use current database */ @@ -481,7 +486,6 @@ dbi_result_t *dbd_list_tables(dbi_conn_t * conn, const return res; } - char *current_db = NULL; if (conn->current_db) /* Reserved current DB name */ current_db = strdup(conn->current_db); @@ -529,9 +533,9 @@ size_t dbd_quote_string(dbi_driver_t * driver, const c { /* foo's -> 'foo''s' */ size_t len; + const char *escaped = "\'"; strcpy(dest, "\'"); - const char *escaped = "\'"; len = _dbd_freetds_escape_chars(dest + 1, orig, strlen(orig), escaped); @@ -580,6 +584,8 @@ dbi_result_t *dbd_query(dbi_conn_t * conn, const char * everything else will be filled in by DBI */ unsigned int idx = 0; + unsigned short type = 0; + unsigned int attribs = 0; dbi_result_t *result = NULL; dbi_row_t *row = NULL; FREETDSCON *tdscon = (FREETDSCON *) conn->connection; @@ -649,9 +655,6 @@ dbi_result_t *dbd_query(dbi_conn_t * conn, const char return NULL; } - unsigned short type = 0; - unsigned int attribs = 0; - _translate_freetds_type(datafmt[idx], &type, &attribs); /* Fill fields value in result */ _dbd_result_add_field(result, idx, datafmt[idx]->name, type, attribs); @@ -976,6 +979,7 @@ dbi_row_t *_dbd_freetds_buffers_binding(dbi_conn_t * c dbi_row_t *row = NULL; unsigned int idx = 0; void *addr = NULL; + char **orig; FREETDSCON *tdscon = (FREETDSCON *) conn->connection; @@ -1003,8 +1007,7 @@ dbi_row_t *_dbd_freetds_buffers_binding(dbi_conn_t * c dstfmt.format = CS_FMT_UNUSED; addr = malloc(sizeof(CS_NUMERIC_TYPE)); - char **orig = - &(result->rows[result->numrows_matched]->field_values[idx].d_string); + orig = &(result->rows[result->numrows_matched]->field_values[idx].d_string); if (cs_convert(tdscon->ctx, datafmt[idx], *orig, &dstfmt, addr, NULL) != CS_SUCCEED) {