Exemplo n.º 1
0
/*
 * 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;
	}
}
Exemplo n.º 2
0
/*!
 * \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;
	}
}
Exemplo n.º 3
0
/*!
 * \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;
	}
}