Exemple #1
0
/**
 * Retrieve a result set
 * \param _h handle to the database
 * \param _r result set that should be retrieved
 * \return zero on success, negative value on failure
 */
static int db_mysql_store_result(const db1_con_t* _h, db1_res_t** _r)
{
	int code;
	if ((!_h) || (!_r)) {
		LM_ERR("invalid parameter value\n");
		return -1;
	}

	*_r = db_mysql_new_result();
	if (*_r == 0) {
		LM_ERR("no memory left\n");
		return -2;
	}

	RES_RESULT(*_r) = mysql_store_result(CON_CONNECTION(_h));
	if (!RES_RESULT(*_r)) {
		if (mysql_field_count(CON_CONNECTION(_h)) == 0) {
			(*_r)->col.n = 0;
			(*_r)->n = 0;
			goto done;
		} else {
			LM_ERR("driver error: %s\n", mysql_error(CON_CONNECTION(_h)));
			code = mysql_errno(CON_CONNECTION(_h));
			if (code == CR_SERVER_GONE_ERROR || code == CR_SERVER_LOST) {
				counter_inc(mysql_cnts_h.driver_err);
			}
			db_mysql_free_result(_h, *_r);
			*_r = 0;
			return -3;
		}
	}

	if (db_mysql_convert_result(_h, *_r) < 0) {
		LM_ERR("error while converting result\n");
		LM_DBG("freeing result set at %p\n", _r);
		/* all mem on Kamailio API side is already freed by
		 * db_mysql_convert_result in case of error, but we also need
		 * to free the mem from the mysql lib side, internal pkg for it
		 * and *_r */
		db_mysql_free_result(_h, *_r);
		*_r = 0;
#if (MYSQL_VERSION_ID >= 40100)
		while( mysql_more_results(CON_CONNECTION(_h)) && mysql_next_result(CON_CONNECTION(_h)) == 0 ) {
			MYSQL_RES *res = mysql_store_result( CON_CONNECTION(_h) );
			mysql_free_result(res);
		}
#endif
		return -4;
	}

done:
#if (MYSQL_VERSION_ID >= 40100)
	while( mysql_more_results(CON_CONNECTION(_h)) && mysql_next_result(CON_CONNECTION(_h)) == 0 ) {
		MYSQL_RES *res = mysql_store_result( CON_CONNECTION(_h) );
		mysql_free_result(res);
	}
#endif

	return 0;
}
Exemple #2
0
/*
 * Retrieve result set
 */
static int db_mysql_store_result(db_con_t* _h, db_res_t** _r)
{
    if ((!_h) || (!_r)) {
        LM_ERR("invalid parameter value\n");
        return -1;
    }

    *_r = db_new_result();
    if (*_r == 0) {
        LM_ERR("no memory left\n");
        return -2;
    }

    CON_RESULT(_h) = mysql_store_result(CON_CONNECTION(_h));
    if (!CON_RESULT(_h)) {
        if (mysql_field_count(CON_CONNECTION(_h)) == 0) {
            (*_r)->col.n = 0;
            (*_r)->n = 0;
            goto done;
        } else {
            LM_ERR("driver error: %s\n", mysql_error(CON_CONNECTION(_h)));
            db_mysql_free_dbresult(*_r);
            *_r = 0;
            return -3;
        }
    }

    if (db_mysql_convert_result(_h, *_r) < 0) {
        LM_ERR("error while converting result\n");
        pkg_free(*_r);
        *_r = 0;
        /* all mem on openser API side is already freed by
         * db_mysql_convert_result in case of error, but we also need
         * to free the mem from the mysql lib side */
        mysql_free_result(CON_RESULT(_h));
#if (MYSQL_VERSION_ID >= 40100)
        while( mysql_next_result( CON_CONNECTION(_h) ) > 0 ) {
            MYSQL_RES *res = mysql_store_result( CON_CONNECTION(_h) );
            mysql_free_result( res );
        }
#endif
        CON_RESULT(_h) = 0;
        return -4;
    }

done:
#if (MYSQL_VERSION_ID >= 40100)
    while( mysql_next_result( CON_CONNECTION(_h) ) > 0 ) {
        MYSQL_RES *res = mysql_store_result( CON_CONNECTION(_h) );
        mysql_free_result( res );
    }
#endif

    return 0;
}