void print_result_meta_series(HSTMT hstmt, SQLSMALLINT *colids, SQLSMALLINT numcols) { int i; printf("Result set metadata:\n"); for (i = 0; i < numcols; i++) { SQLRETURN rc; SQLCHAR colname[50]; SQLSMALLINT colnamelen; SQLSMALLINT datatype; SQLULEN colsize; SQLSMALLINT decdigits; SQLSMALLINT nullable; rc = SQLDescribeCol(hstmt, colids[i], colname, sizeof(colname), &colnamelen, &datatype, &colsize, &decdigits, &nullable); if (!SQL_SUCCEEDED(rc)) { print_diag("SQLDescribeCol failed", SQL_HANDLE_STMT, hstmt); return; } printf("%s: %s(%u) digits: %d, %s\n", colname, datatype_str(datatype), (unsigned int) colsize, decdigits, nullable_str(nullable)); } }
int main(int argc, char **argv) { SQLRETURN rc; HSTMT hstmt = SQL_NULL_HSTMT; char param1[20] = { 1, 2, 3, 4, 5, 6, 7, 8 }; SQLLEN cbParam1; SQLSMALLINT colcount; SQLSMALLINT dataType; SQLULEN paramSize; SQLSMALLINT decDigits; SQLSMALLINT nullable; test_connect(); rc = SQLAllocHandle(SQL_HANDLE_STMT, conn, &hstmt); if (!SQL_SUCCEEDED(rc)) { print_diag("failed to allocate stmt handle", SQL_HANDLE_DBC, conn); exit(1); } /**** Query with a bytea param ****/ /* Prepare a statement */ rc = SQLPrepare(hstmt, (SQLCHAR *) "SELECT id, t FROM byteatab WHERE t = ?", SQL_NTS); CHECK_STMT_RESULT(rc, "SQLPrepare failed", hstmt); /* bind param */ cbParam1 = 8; rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_BINARY, /* value type */ SQL_BINARY, /* param type */ 20, /* column size */ 0, /* dec digits */ param1, /* param value ptr */ 0, /* buffer len */ &cbParam1 /* StrLen_or_IndPtr */); CHECK_STMT_RESULT(rc, "SQLBindParameter failed", hstmt); /* Test SQLNumResultCols, called before SQLExecute() */ rc = SQLNumResultCols(hstmt, &colcount); CHECK_STMT_RESULT(rc, "SQLNumResultCols failed", hstmt); printf("# of result cols: %d\n", colcount); /* Execute */ rc = SQLExecute(hstmt); CHECK_STMT_RESULT(rc, "SQLExecute failed", hstmt); /* Fetch result */ print_result(hstmt); rc = SQLFreeStmt(hstmt, SQL_CLOSE); CHECK_STMT_RESULT(rc, "SQLFreeStmt failed", hstmt); /*** Test SQLBindParameter with SQLExecDirect ***/ printf("\nTesting SQLBindParameter with SQLExecDirect...\n"); /* bind param */ strcpy(param1, "bar"); cbParam1 = SQL_NTS; rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, /* value type */ SQL_CHAR, /* param type */ 20, /* column size */ 0, /* dec digits */ param1, /* param value ptr */ 0, /* buffer len */ &cbParam1 /* StrLen_or_IndPtr */); CHECK_STMT_RESULT(rc, "SQLBindParameter failed", hstmt); rc = SQLExecDirect(hstmt, (SQLCHAR *) "SELECT 'foo' UNION ALL SELECT ?", SQL_NTS); CHECK_STMT_RESULT(rc, "SQLExecDirect failed", hstmt); print_result(hstmt); rc = SQLFreeStmt(hstmt, SQL_CLOSE); CHECK_STMT_RESULT(rc, "SQLFreeStmt failed", hstmt); /*** Test SQLDescribeParam ***/ printf("\nTesting SQLDescribeParam...\n"); rc = SQLFreeStmt(hstmt, SQL_RESET_PARAMS); CHECK_STMT_RESULT(rc, "SQLFreeStmt failed", hstmt); /* Prepare a statement */ rc = SQLPrepare(hstmt, (SQLCHAR *) "SELECT id, t FROM testtab1 WHERE id = ?", SQL_NTS); CHECK_STMT_RESULT(rc, "SQLPrepare failed", hstmt); rc = SQLDescribeParam(hstmt, 1, &dataType, ¶mSize, &decDigits, &nullable); CHECK_STMT_RESULT(rc, "SQLDescribeParams failed", hstmt); printf("Param 1: type %s; size %u; dec digits %d; %s\n", datatype_str(dataType), (unsigned int) paramSize, decDigits, nullable_str(nullable)); /* bind param */ strcpy(param1, "3"); cbParam1 = SQL_NTS; rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, /* value type */ SQL_CHAR, /* param type */ 20, /* column size */ 0, /* dec digits */ param1, /* param value ptr */ 0, /* buffer len */ &cbParam1 /* StrLen_or_IndPtr */); CHECK_STMT_RESULT(rc, "SQLBindParameter failed", hstmt); /* Test SQLNumResultCols, called before SQLExecute() */ rc = SQLNumResultCols(hstmt, &colcount); CHECK_STMT_RESULT(rc, "SQLNumResultCols failed", hstmt); printf("# of result cols: %d\n", colcount); /* Execute */ rc = SQLExecute(hstmt); CHECK_STMT_RESULT(rc, "SQLExecute failed", hstmt); /* Fetch result */ print_result(hstmt); rc = SQLFreeStmt(hstmt, SQL_CLOSE); CHECK_STMT_RESULT(rc, "SQLFreeStmt failed", hstmt); /* Clean up */ test_disconnect(); return 0; }
static void generate_case(int op, int type, int match, uint64_t match_bits, datatype_t din, datatype_t dout, datatype_t tgt, datatype_t z, int length, int fetch) { FILE *f; char *ptl_op; char *me_opt; if (to_files) { char fname[1000]; casenum ++; sprintf(fname, "temp/test_atomic_all-%03d.xml", casenum); f = fopen(fname, "w"); if (f == NULL) { fprintf(stderr, "Cannot create file %s - aborting!\n", fname); exit(1); } } else { f = stdout; } fprintf(f, "<?xml version=\"1.0\"?>\n"); fprintf(f, "<!--\n"); fprintf(f, " seed = %d\n", seed); fprintf(f, " max_length = %d\n", max_length); fprintf(f, "-->\n"); fprintf(f, "<test>\n"); ptl_op = fetch ? "fetch" : "atomic"; me_opt = fetch ? "OP_GET OP_PUT" : "OP_PUT"; fprintf(f, " <desc>Test %s %s/%s length=%d</desc>\n", ptl_op, atom_op_name[op], atom_type[type].name, length); fprintf(f, " <ptl>\n"); fprintf(f, " <ptl_ni ni_opt=\"%s %s\">\n", match ? "MATCH" : "NO_MATCH", "PHYSICAL"); fprintf(f, " <ptl_pt>\n"); /* setup me/le */ if (match) fprintf(f, " <ptl_me me_opt=\"%s\" me_match=\"0x%" PRIu64 "\" type=\"%s\" me_data=\"%s\">\n", me_opt, match_bits, atom_type[type].name, datatype_str(type, tgt)); else fprintf(f, " <ptl_le le_opt=\"%s\" type=\"%s\" le_data=\"%s\">\n", me_opt, atom_type[type].name, datatype_str(type, tgt)); /* setup md(s) */ fprintf(f, " <ptl_md type=\"%s\" md_data=\"%s\">\n", atom_type[type].name, datatype_str(type, dout)); if (fetch) fprintf(f, " <ptl_md type=\"%s\" md_data=\"%s\">\n", atom_type[type].name, datatype_str(type, din)); if (match) fprintf(f, " <ptl_%s atom_op=\"%s\" atom_type=\"%s\" length=\"%d\" match=\"0x%" PRIu64 "\" target_id=\"SELF\"/>\n", ptl_op, atom_op_name[op], atom_type[type].name, length, match_bits); else fprintf(f, " <ptl_%s atom_op=\"%s\" atom_type=\"%s\" length=\"%d\" target_id=\"SELF\"/>\n", ptl_op, atom_op_name[op], atom_type[type].name, length); /* TODO replace with an event */ fprintf(f, " <msleep count=\"10\"/>\n"); if (fetch) { /* check to see that din data has changed */ fprintf(f, " <check length=\"%d\" type=\"%s\" md_data=\"%s\"/>\n", length, atom_type[type].name, datatype_str(type, tgt)); fprintf(f, " <check length=\"%d\" type=\"%s\" offset=\"%d\" md_data=\"%s\"/>\n", atom_type[type].size, atom_type[type].name, length, datatype_str(type, din)); fprintf(f, " </ptl_md>\n"); } /* check to see that dout data has not changed */ fprintf(f, " <check length=\"%d\" type=\"%s\" md_data=\"%s\"/>\n", length, atom_type[type].name, datatype_str(type, dout)); fprintf(f, " <check length=\"%d\" type=\"%s\" offset=\"%d\" md_data=\"%s\"/>\n", atom_type[type].size, atom_type[type].name, length, datatype_str(type, dout)); fprintf(f, " </ptl_md>\n"); /* check to see that target data has changed */ if (match) { fprintf(f, " <check length=\"%d\" type=\"%s\" me_data=\"%s\"/>\n", length, atom_type[type].name, datatype_str(type, z)); fprintf(f, " <check length=\"%d\" type=\"%s\" offset=\"%d\" me_data=\"%s\"/>\n", atom_type[type].size, atom_type[type].name, length, datatype_str(type, tgt)); } else { fprintf(f, " <check length=\"%d\" type=\"%s\" le_data=\"%s\"/>\n", length, atom_type[type].name, datatype_str(type, z)); fprintf(f, " <check length=\"%d\" type=\"%s\" offset=\"%d\" le_data=\"%s\"/>\n", atom_type[type].size, atom_type[type].name, length, datatype_str(type, tgt)); } if (match) fprintf(f, " </ptl_me>\n"); else fprintf(f, " </ptl_le>\n"); fprintf(f, " </ptl_pt>\n"); fprintf(f, " </ptl_ni>\n"); fprintf(f, " </ptl>\n"); fprintf(f, "</test>\n"); if (to_files) { fclose(f); } }