ast_str_SQLGetData is *not* part of the ast_str API, it's part of the ast_odbc API and just happens to use an ast_str as the buffer; move all of it to res_odbc.c and res_odbc.h, renaming appropriately
along the way fix some minor coding style issues in strings.h and add some attribute_pure annotations to functions in the ast_str API git-svn-id: http://svn.digium.com/svn/asterisk/trunk@169438 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
parent
1bd2376769
commit
a343f7a275
|
@ -30,7 +30,6 @@
|
|||
<depend>res_odbc</depend>
|
||||
***/
|
||||
|
||||
#define USE_ODBC
|
||||
#include "asterisk.h"
|
||||
|
||||
ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
||||
|
@ -543,7 +542,7 @@ static int acf_odbc_read(struct ast_channel *chan, const char *cmd, char *s, cha
|
|||
}
|
||||
|
||||
buflen = strlen(buf);
|
||||
res = ast_str_SQLGetData(&coldata, -1, stmt, x + 1, SQL_CHAR, &indicator);
|
||||
res = ast_odbc_ast_str_SQLGetData(&coldata, -1, stmt, x + 1, SQL_CHAR, &indicator);
|
||||
if (indicator == SQL_NULL_DATA) {
|
||||
ast_debug(3, "Got NULL data\n");
|
||||
ast_str_reset(coldata);
|
||||
|
@ -1093,7 +1092,7 @@ static char *cli_odbc_read(struct ast_cli_entry *e, int cmd, struct ast_cli_args
|
|||
snprintf(colname, sizeof(colname), "field%d", x);
|
||||
}
|
||||
|
||||
res = ast_str_SQLGetData(&coldata, maxcol, stmt, x + 1, SQL_CHAR, &indicator);
|
||||
res = ast_odbc_ast_str_SQLGetData(&coldata, maxcol, stmt, x + 1, SQL_CHAR, &indicator);
|
||||
if (indicator == SQL_NULL_DATA) {
|
||||
ast_str_set(&coldata, 0, "(nil)");
|
||||
res = SQL_SUCCESS;
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include <sqlext.h>
|
||||
#include <sqltypes.h>
|
||||
#include "asterisk/linkedlists.h"
|
||||
#include "asterisk/strings.h"
|
||||
|
||||
typedef enum { ODBC_SUCCESS=0, ODBC_FAIL=-1} odbc_status;
|
||||
|
||||
|
@ -183,4 +184,14 @@ int ast_odbc_clear_cache(const char *database, const char *tablename);
|
|||
*/
|
||||
#define ast_odbc_release_table(ptr) if (ptr) { AST_RWLIST_UNLOCK(&(ptr)->columns); }
|
||||
|
||||
/*!\brief Wrapper for SQLGetData to use with dynamic strings
|
||||
* \param buf Address of the pointer to the ast_str structure.
|
||||
* \param maxlen The maximum size of the resulting string, or 0 for no limit.
|
||||
* \param StatementHandle The statement handle from which to retrieve data.
|
||||
* \param ColumnNumber Column number (1-based offset) for which to retrieve data.
|
||||
* \param TargetType The SQL constant indicating what kind of data is to be retrieved (usually SQL_CHAR)
|
||||
* \param StrLen_or_Ind A pointer to a length indicator, specifying the total length of data.
|
||||
*/
|
||||
SQLRETURN ast_odbc_ast_str_SQLGetData(struct ast_str **buf, int pmaxlen, SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLLEN *StrLen_or_Ind);
|
||||
|
||||
#endif /* _ASTERISK_RES_ODBC_H */
|
||||
|
|
|
@ -60,7 +60,7 @@ static force_inline int _ast_strlen_zero(const char *s, const char *file, const
|
|||
}
|
||||
|
||||
#else
|
||||
static force_inline int ast_strlen_zero(const char *s)
|
||||
static force_inline int attribute_pure ast_strlen_zero(const char *s)
|
||||
{
|
||||
return (!s || (*s == '\0'));
|
||||
}
|
||||
|
@ -83,11 +83,11 @@ static force_inline int ast_strlen_zero(const char *s)
|
|||
\return a pointer to the first non-whitespace character
|
||||
*/
|
||||
AST_INLINE_API(
|
||||
char *ast_skip_blanks(const char *str),
|
||||
char * attribute_pure ast_skip_blanks(const char *str),
|
||||
{
|
||||
while (*str && ((unsigned char) *str) < 33)
|
||||
str++;
|
||||
return (char *)str;
|
||||
return (char *) str;
|
||||
}
|
||||
)
|
||||
|
||||
|
@ -122,11 +122,11 @@ char *ast_trim_blanks(char *str),
|
|||
\return a pointer to the first whitespace character
|
||||
*/
|
||||
AST_INLINE_API(
|
||||
char *ast_skip_nonblanks(char *str),
|
||||
char * attribute_pure ast_skip_nonblanks(const char *str),
|
||||
{
|
||||
while (*str && ((unsigned char) *str) > 32)
|
||||
str++;
|
||||
return str;
|
||||
return (char *) str;
|
||||
}
|
||||
)
|
||||
|
||||
|
@ -142,9 +142,9 @@ char *ast_skip_nonblanks(char *str),
|
|||
AST_INLINE_API(
|
||||
char *ast_strip(char *s),
|
||||
{
|
||||
s = ast_skip_blanks(s);
|
||||
if (s)
|
||||
if ((s = ast_skip_blanks(s))) {
|
||||
ast_trim_blanks(s);
|
||||
}
|
||||
return s;
|
||||
}
|
||||
)
|
||||
|
@ -257,7 +257,7 @@ int ast_build_string_va(char **buffer, size_t *space, const char *fmt, va_list a
|
|||
* \retval -1 if "true".
|
||||
* \retval 0 otherwise.
|
||||
*/
|
||||
int ast_true(const char *val);
|
||||
int attribute_pure ast_true(const char *val);
|
||||
|
||||
/*!
|
||||
* \brief Make sure something is false.
|
||||
|
@ -269,7 +269,7 @@ int ast_true(const char *val);
|
|||
* \retval -1 if "true".
|
||||
* \retval 0 otherwise.
|
||||
*/
|
||||
int ast_false(const char *val);
|
||||
int attribute_pure ast_false(const char *val);
|
||||
|
||||
/*
|
||||
* \brief Join an array of strings into a single string.
|
||||
|
@ -397,8 +397,9 @@ void ast_str_reset(struct ast_str *buf),
|
|||
{
|
||||
if (buf) {
|
||||
buf->__AST_STR_USED = 0;
|
||||
if (buf->__AST_STR_LEN)
|
||||
if (buf->__AST_STR_LEN) {
|
||||
buf->__AST_STR_STR[0] = '\0';
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
|
@ -432,7 +433,7 @@ void ast_str_trim_blanks(struct ast_str *buf),
|
|||
* \param A pointer to the ast_str string.
|
||||
*/
|
||||
AST_INLINE_API(
|
||||
size_t ast_str_strlen(struct ast_str *buf),
|
||||
size_t attribute_pure ast_str_strlen(struct ast_str *buf),
|
||||
{
|
||||
return buf->__AST_STR_USED;
|
||||
}
|
||||
|
@ -442,7 +443,7 @@ size_t ast_str_strlen(struct ast_str *buf),
|
|||
* \param A pointer to the ast_str string.
|
||||
*/
|
||||
AST_INLINE_API(
|
||||
size_t ast_str_size(struct ast_str *buf),
|
||||
size_t attribute_pure ast_str_size(struct ast_str *buf),
|
||||
{
|
||||
return buf->__AST_STR_LEN;
|
||||
}
|
||||
|
@ -452,7 +453,7 @@ size_t ast_str_size(struct ast_str *buf),
|
|||
* \param A pointer to the ast_str string.
|
||||
*/
|
||||
AST_INLINE_API(
|
||||
attribute_pure char *ast_str_buffer(struct ast_str *buf),
|
||||
char * attribute_pure ast_str_buffer(struct ast_str *buf),
|
||||
{
|
||||
return buf->__AST_STR_STR;
|
||||
}
|
||||
|
@ -752,39 +753,6 @@ AST_INLINE_API(char *ast_str_append_escapecommas(struct ast_str **buf, size_t ma
|
|||
}
|
||||
)
|
||||
|
||||
/*!\brief Wrapper for SQLGetData to use with dynamic strings
|
||||
* \param buf Address of the pointer to the ast_str structure.
|
||||
* \param maxlen The maximum size of the resulting string, or 0 for no limit.
|
||||
* \param StatementHandle The statement handle from which to retrieve data.
|
||||
* \param ColumnNumber Column number (1-based offset) for which to retrieve data.
|
||||
* \param TargetType The SQL constant indicating what kind of data is to be retrieved (usually SQL_CHAR)
|
||||
* \param StrLen_or_Ind A pointer to a length indicator, specifying the total length of data.
|
||||
*/
|
||||
#ifdef USE_ODBC
|
||||
#include <sql.h>
|
||||
#include <sqlext.h>
|
||||
#include <sqltypes.h>
|
||||
|
||||
AST_INLINE_API(SQLRETURN ast_str_SQLGetData(struct ast_str **buf, int pmaxlen, SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLLEN *StrLen_or_Ind),
|
||||
{
|
||||
SQLRETURN res;
|
||||
size_t maxlen;
|
||||
if (pmaxlen == 0) {
|
||||
if (SQLGetData(StatementHandle, ColumnNumber, TargetType, (*buf)->__AST_STR_STR, 0, StrLen_or_Ind) == SQL_SUCCESS_WITH_INFO) {
|
||||
ast_str_make_space(buf, *StrLen_or_Ind + 1);
|
||||
}
|
||||
} else if (pmaxlen > 0) {
|
||||
ast_str_make_space(buf, pmaxlen);
|
||||
}
|
||||
maxlen = (*buf)->__AST_STR_LEN;
|
||||
res = SQLGetData(StatementHandle, ColumnNumber, TargetType, (*buf)->__AST_STR_STR, maxlen, StrLen_or_Ind);
|
||||
(*buf)->__AST_STR_USED = *StrLen_or_Ind;
|
||||
return res;
|
||||
}
|
||||
)
|
||||
#endif /* defined(USE_ODBC) */
|
||||
|
||||
|
||||
/*!
|
||||
* \brief Set a dynamic string using variable arguments
|
||||
*
|
||||
|
@ -846,7 +814,7 @@ int __attribute__((format(printf, 3, 4))) ast_str_append(
|
|||
*
|
||||
* http://www.cse.yorku.ca/~oz/hash.html
|
||||
*/
|
||||
static force_inline int ast_str_hash(const char *str)
|
||||
static force_inline int attribute_pure ast_str_hash(const char *str)
|
||||
{
|
||||
int hash = 5381;
|
||||
|
||||
|
@ -863,7 +831,7 @@ static force_inline int ast_str_hash(const char *str)
|
|||
* all characters to lowercase prior to computing a hash. This
|
||||
* allows for easy case-insensitive lookups in a hash table.
|
||||
*/
|
||||
static force_inline int ast_str_case_hash(const char *str)
|
||||
static force_inline int attribute_pure ast_str_case_hash(const char *str)
|
||||
{
|
||||
int hash = 5381;
|
||||
|
||||
|
|
|
@ -48,6 +48,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
|
|||
#include "asterisk/res_odbc.h"
|
||||
#include "asterisk/time.h"
|
||||
#include "asterisk/astobj2.h"
|
||||
#include "asterisk/strings.h"
|
||||
|
||||
struct odbc_class
|
||||
{
|
||||
|
@ -366,6 +367,22 @@ int ast_odbc_smart_execute(struct odbc_obj *obj, SQLHSTMT stmt)
|
|||
return res;
|
||||
}
|
||||
|
||||
SQLRETURN ast_odbc_ast_str_SQLGetData(struct ast_str **buf, int pmaxlen, SQLHSTMT StatementHandle, SQLUSMALLINT ColumnNumber, SQLSMALLINT TargetType, SQLLEN *StrLen_or_Ind)
|
||||
{
|
||||
SQLRETURN res;
|
||||
|
||||
if (pmaxlen == 0) {
|
||||
if (SQLGetData(StatementHandle, ColumnNumber, TargetType, ast_str_buffer(*buf), 0, StrLen_or_Ind) == SQL_SUCCESS_WITH_INFO) {
|
||||
ast_str_make_space(buf, *StrLen_or_Ind + 1);
|
||||
}
|
||||
} else if (pmaxlen > 0) {
|
||||
ast_str_make_space(buf, pmaxlen);
|
||||
}
|
||||
res = SQLGetData(StatementHandle, ColumnNumber, TargetType, ast_str_buffer(*buf), ast_str_size(*buf), StrLen_or_Ind);
|
||||
ast_str_update(*buf);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
int ast_odbc_sanity_check(struct odbc_obj *obj)
|
||||
{
|
||||
|
|
Reference in New Issue