PreparedStatement_T MysqlConnection_prepareStatement(T C, const char *sql, va_list ap) { va_list ap_copy; MYSQL_STMT *stmt = NULL; assert(C); StringBuffer_clear(C->sb); va_copy(ap_copy, ap); StringBuffer_vappend(C->sb, sql, ap_copy); va_end(ap_copy); if (prepare(C, StringBuffer_toString(C->sb), StringBuffer_length(C->sb), &stmt)) return PreparedStatement_new(MysqlPreparedStatement_new(stmt, C->maxRows), (Pop_T)&mysqlpops); return NULL; }
PreparedStatement_T PostgresqlConnection_prepareStatement(T C, const char *sql, va_list ap) { char *name; int paramCount = 0; va_list ap_copy; assert(C); assert(sql); PQclear(C->res); va_copy(ap_copy, ap); StringBuffer_vset(C->sb, sql, ap_copy); va_end(ap_copy); paramCount = StringBuffer_prepare4postgres(C->sb); uint32_t t = ++statementid; // increment is atomic name = Str_cat("%d", t); C->res = PQprepare(C->db, name, StringBuffer_toString(C->sb), 0, NULL); C->lastError = C->res ? PQresultStatus(C->res) : PGRES_FATAL_ERROR; if (C->lastError == PGRES_EMPTY_QUERY || C->lastError == PGRES_COMMAND_OK || C->lastError == PGRES_TUPLES_OK) return PreparedStatement_new(PostgresqlPreparedStatement_new(C->db, C->maxRows, name, paramCount), (Pop_T)&postgresqlpops, paramCount); return NULL; }
PreparedStatement_T OracleConnection_prepareStatement(T C, const char *sql, va_list ap) { OCIStmt *stmtp; va_list ap_copy; assert(C); va_copy(ap_copy, ap); StringBuffer_vset(C->sb, sql, ap_copy); va_end(ap_copy); StringBuffer_trim(C->sb); int paramCount = StringBuffer_prepare4oracle(C->sb); /* Build statement */ C->lastError = OCIHandleAlloc(C->env, (void **)&stmtp, OCI_HTYPE_STMT, 0, 0); if (C->lastError != OCI_SUCCESS && C->lastError != OCI_SUCCESS_WITH_INFO) return NULL; C->lastError = OCIStmtPrepare(stmtp, C->err, StringBuffer_toString(C->sb), StringBuffer_length(C->sb), OCI_NTV_SYNTAX, OCI_DEFAULT); if (C->lastError != OCI_SUCCESS && C->lastError != OCI_SUCCESS_WITH_INFO) { OCIHandleFree(stmtp, OCI_HTYPE_STMT); return NULL; } return PreparedStatement_new(OraclePreparedStatement_new(stmtp, C->env, C->usr, C->err, C->svc, C->maxRows), (Pop_T)&oraclepops, paramCount); }
PreparedStatement_T SqlServerConnection_prepareStatement(T C, const char *sql, va_list ap) { va_list ap_copy; const char *tail; HSTMT hstmt; assert(C); StringBuffer_clear(C->sb); va_copy(ap_copy, ap); StringBuffer_vappend(C->sb, sql, ap_copy); va_end(ap_copy); C->lastError = SQLAllocStmt(C->db->hdbc,&hstmt); C->lastError = SQLPrepare(hstmt,StringBuffer_toString(C->sb),strlen(StringBuffer_toString(C->sb))); //The third argument with an array of the same size , but not the same database column if (SQLSERVERSUCCESS(C->lastError)) { int paramCount = 0; return PreparedStatement_new(SqlServerPreparedStatement_new(C->db, hstmt, C->maxRows), (Pop_T)&sqlserverpops, paramCount); } else { getSqlErr(C,hstmt); } return NULL; }