PgStatement::PgParameters::PgParameters ( const ArrayRecord& raParameters ) : paramValues(NULL), paramLengths(NULL), paramFormats(NULL) { nParamCount = raParameters.size(); if(nParamCount > 0) { paramTypes = new Oid [nParamCount]; paramValues = new char * [nParamCount]; paramLengths = new int[nParamCount]; paramFormats = new int[nParamCount]; for(int i = 0; i < nParamCount; i++) { wxString sType = raParameters.at(i).GetType(); Oid oid = Postgres::GetPgOidFromVariantType(sType); paramTypes[i] = oid; if(sType == TYPENAME_LONG) { // Binary data must be in big endian byte order unsigned long ul = (unsigned long) raParameters.at(i).GetLong(); unsigned long ulBigEndian = htonl(ul); long * pl = (long *) malloc(sizeof(long)); paramValues[i] = (char *) pl; *pl = ulBigEndian; paramLengths[i] = sizeof(long); paramFormats[i] = 1; } else if(sType == TYPENAME_BOOLEAN) { bool * pb = (bool *) malloc(sizeof(bool)); paramValues[i] = (char *) pb; *pb = raParameters.at(i).GetBool(); paramLengths[i] = sizeof(bool); paramFormats[i] = 1; } else if(sType == TYPENAME_DOUBLE) { // FIXME: Don't know the network conversion for double // so we can't pass binary data double d = raParameters.at(i).GetDouble(); char * sz = (char *) malloc(20 * sizeof(char)); sprintf(sz, "%.10f", d); paramValues[i] = sz; paramLengths[i] = 0; paramFormats[i] = 0; // Treat as text for now } else if(sType == TYPENAME_STRING) { wxString s = raParameters.at(i).GetString(); char * sz = (char *) malloc((s.Length() + 1) * sizeof(char)); strcpy(sz, s.mbc_str()); paramValues[i] = sz; paramLengths[i] = 0; paramFormats[i] = 0; } else throw wx::Exception(wxT("PgStatement::PgParameters::PgParameters() Unknown type '%s'"), sType); } } }