/* * Used when converting a result from the query */ int db_unixodbc_val2str(const db1_con_t* _c, const db_val_t* _v, char* _s, int* _len) { int l, tmp; char* old_s; /* db_unixodbc uses a custom escape function */ tmp = db_val2str(_c, _v, _s, _len); if (tmp < 1) return tmp; switch(VAL_TYPE(_v)) { case DB1_STRING: l = strlen(VAL_STRING(_v)); if (*_len < (l * 2 + 3)) { LM_ERR("destination buffer too short\n"); return -6; } else { old_s = _s; *_s++ = '\''; if(use_escape_common) { _s += escape_common(_s, (char*)VAL_STRING(_v), l); } else { memcpy(_s, VAL_STRING(_v), l); _s += l; } *_s++ = '\''; *_s = '\0'; /* FIXME */ *_len = _s - old_s; return 0; } break; case DB1_STR: l = VAL_STR(_v).len; if (*_len < (l * 2 + 3)) { LM_ERR("destination buffer too short\n"); return -7; } else { old_s = _s; *_s++ = '\''; if(use_escape_common) { _s += escape_common(_s, VAL_STR(_v).s, l); } else { memcpy(_s, VAL_STR(_v).s, l); _s += l; } *_s++ = '\''; *_s = '\0'; /* FIXME */ *_len = _s - old_s; return 0; } break; case DB1_BLOB: l = VAL_BLOB(_v).len; if (*_len < (l * 2 + 3)) { LM_ERR("destination buffer too short\n"); return -9; } else { old_s = _s; *_s++ = '\''; if(use_escape_common) { _s += escape_common(_s, VAL_BLOB(_v).s, l); } else { memcpy(_s, VAL_BLOB(_v).s, l); _s += l; } *_s++ = '\''; *_s = '\0'; /* FIXME */ *_len = _s - old_s; return 0; } break; default: LM_DBG("unknown data type\n"); return -10; } }
/*! * \brief Converting a value to a string * * Converting a value to a string, used when converting result from a query * \param _c database connection * \param _v source value * \param _s target string * \param _len target string length * \return 0 on success, negative on error */ int db_mysql_val2str(const db1_con_t* _c, const db_val_t* _v, char* _s, int* _len) { int l, tmp; char* old_s; tmp = db_val2str(_c, _v, _s, _len); if (tmp < 1) return tmp; switch(VAL_TYPE(_v)) { case DB1_STRING: l = strlen(VAL_STRING(_v)); if (*_len < (l * 2 + 3)) { LM_ERR("destination buffer too short\n"); return -6; } else { old_s = _s; *_s++ = '\''; _s += mysql_real_escape_string(CON_CONNECTION(_c), _s, VAL_STRING(_v), l); *_s++ = '\''; *_s = '\0'; /* FIXME */ *_len = _s - old_s; return 0; } break; case DB1_STR: if (*_len < (VAL_STR(_v).len * 2 + 3)) { LM_ERR("destination buffer too short\n"); return -7; } else { old_s = _s; *_s++ = '\''; _s += mysql_real_escape_string(CON_CONNECTION(_c), _s, VAL_STR(_v).s, VAL_STR(_v).len); *_s++ = '\''; *_s = '\0'; *_len = _s - old_s; return 0; } break; case DB1_BLOB: l = VAL_BLOB(_v).len; if (*_len < (l * 2 + 3)) { LM_ERR("destination buffer too short\n"); return -9; } else { old_s = _s; *_s++ = '\''; _s += mysql_real_escape_string(CON_CONNECTION(_c), _s, VAL_STR(_v).s, l); *_s++ = '\''; *_s = '\0'; *_len = _s - old_s; return 0; } break; default: LM_DBG("unknown data type\n"); return -10; } }
/*! * \brief Converting a value to a string * * Converting a value to a string, used when converting result from a query * \param _con database connection * \param _v source value * \param _s target string * \param _len target string length * \return 0 on success, negative on error */ int db_postgres_val2str( const db1_con_t *_con, const db_val_t *_v, char *_s, int *_len) { int l, ret, tmp; int pgret; char *tmp_s; size_t tmp_len; char *old_s; tmp = db_val2str(_con, _v, _s, _len); if(tmp < 1) return tmp; switch(VAL_TYPE(_v)) { case DB1_STRING: l = strlen(VAL_STRING(_v)); if(*_len < (l * 2 + 3)) { LM_ERR("destination buffer too short for string\n"); return -6; } else { old_s = _s; *_s++ = '\''; ret = PQescapeStringConn( CON_CONNECTION(_con), _s, VAL_STRING(_v), l, &pgret); if(pgret != 0) { LM_ERR("PQescapeStringConn failed\n"); return -6; } LM_DBG("PQescapeStringConn: in: %d chars," " out: %d chars\n", l, ret); _s += ret; *_s++ = '\''; *_s = '\0'; /* FIXME */ *_len = _s - old_s; return 0; } break; case DB1_STR: l = VAL_STR(_v).len; if(*_len < (l * 2 + 3)) { LM_ERR("destination buffer too short for str\n"); return -7; } else { old_s = _s; *_s++ = '\''; ret = PQescapeStringConn( CON_CONNECTION(_con), _s, VAL_STRING(_v), l, &pgret); if(pgret != 0) { LM_ERR("PQescapeStringConn failed \n"); return -7; } LM_DBG("PQescapeStringConn: in: %d chars, out: %d chars\n", l, ret); _s += ret; *_s++ = '\''; *_s = '\0'; /* FIXME */ *_len = _s - old_s; return 0; } break; case DB1_BLOB: l = VAL_BLOB(_v).len; /* this estimation is not always correct, thus we need to check later again */ if(*_len < (l * 2 + 3)) { LM_ERR("destination buffer too short for blob\n"); return -9; } else { *_s++ = '\''; tmp_s = (char *)PQescapeByteaConn(CON_CONNECTION(_con), (unsigned char *)VAL_STRING(_v), (size_t)l, (size_t *)&tmp_len); if(tmp_s == NULL) { LM_ERR("PQescapeByteaConn failed\n"); return -9; } if(tmp_len > *_len) { LM_ERR("escaped result too long\n"); return -9; } memcpy(_s, tmp_s, tmp_len); PQfreemem(tmp_s); tmp_len = strlen(_s); *(_s + tmp_len) = '\''; *(_s + tmp_len + 1) = '\0'; *_len = tmp_len + 2; return 0; } break; default: LM_ERR("unknown data type\n"); return -10; } }