mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	Merge ast_str_opaque branch (discontinue usage of ast_str internals)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@163991 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -354,14 +354,11 @@ static size_t WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *da | ||||
| 	register int realsize = size * nmemb; | ||||
| 	struct ast_str **pstr = (struct ast_str **)data; | ||||
|  | ||||
| 	ast_debug(3, "Called with data=%p, str=%p, realsize=%d, len=%zu, used=%zu\n", data, *pstr, realsize, (*pstr)->len, (*pstr)->used); | ||||
| 	ast_debug(3, "Called with data=%p, str=%p, realsize=%d, len=%zu, used=%zu\n", data, *pstr, realsize, ast_str_size(*pstr), ast_str_strlen(*pstr)); | ||||
|  | ||||
| 	if (ast_str_make_space(pstr, (((*pstr)->used + realsize + 1) / 512 + 1) * 512 + 230) == 0) { | ||||
| 		memcpy(&((*pstr)->str[(*pstr)->used]), ptr, realsize); | ||||
| 		(*pstr)->used += realsize; | ||||
| 	} | ||||
| 	ast_str_append_substr(pstr, 0, ptr, realsize); | ||||
|  | ||||
| 	ast_debug(3, "Now, len=%zu, used=%zu\n", (*pstr)->len, (*pstr)->used); | ||||
| 	ast_debug(3, "Now, len=%zu, used=%zu\n", ast_str_size(*pstr), ast_str_strlen(*pstr)); | ||||
|  | ||||
| 	return realsize; | ||||
| } | ||||
| @@ -467,18 +464,15 @@ static int acf_curl_exec(struct ast_channel *chan, const char *cmd, char *info, | ||||
| 		curl_easy_setopt(*curl, CURLOPT_POST, 0); | ||||
| 	} | ||||
|  | ||||
| 	if (str->used) { | ||||
| 		str->str[str->used] = '\0'; | ||||
| 		if (str->str[str->used - 1] == '\n') { | ||||
| 			str->str[str->used - 1] = '\0'; | ||||
| 		} | ||||
| 	if (ast_str_strlen(str)) { | ||||
| 		ast_str_trim_blanks(str); | ||||
|  | ||||
| 		ast_log(LOG_NOTICE, "str='%s'\n", str->str); | ||||
| 		ast_debug(3, "str='%s'\n", ast_str_buffer(str)); | ||||
| 		if (hashcompat) { | ||||
| 			char *remainder = str->str; | ||||
| 			char *remainder = ast_str_buffer(str); | ||||
| 			char *piece; | ||||
| 			struct ast_str *fields = ast_str_create(str->used / 2); | ||||
| 			struct ast_str *values = ast_str_create(str->used / 2); | ||||
| 			struct ast_str *fields = ast_str_create(ast_str_strlen(str) / 2); | ||||
| 			struct ast_str *values = ast_str_create(ast_str_strlen(str) / 2); | ||||
| 			int rowcount = 0; | ||||
| 			while ((piece = strsep(&remainder, "&"))) { | ||||
| 				char *name = strsep(&piece, "="); | ||||
| @@ -488,12 +482,12 @@ static int acf_curl_exec(struct ast_channel *chan, const char *cmd, char *info, | ||||
| 				ast_str_append(&values, 0, "%s%s", rowcount ? "," : "", piece); | ||||
| 				rowcount++; | ||||
| 			} | ||||
| 			pbx_builtin_setvar_helper(chan, "~ODBCFIELDS~", fields->str); | ||||
| 			ast_copy_string(buf, values->str, len); | ||||
| 			pbx_builtin_setvar_helper(chan, "~ODBCFIELDS~", ast_str_buffer(fields)); | ||||
| 			ast_copy_string(buf, ast_str_buffer(values), len); | ||||
| 			ast_free(fields); | ||||
| 			ast_free(values); | ||||
| 		} else { | ||||
| 			ast_copy_string(buf, str->str, len); | ||||
| 			ast_copy_string(buf, ast_str_buffer(str), len); | ||||
| 		} | ||||
| 		ret = 0; | ||||
| 	} | ||||
|   | ||||
| @@ -34,6 +34,7 @@ | ||||
| 	<use>iodbc</use> | ||||
|  ***/ | ||||
|  | ||||
| #define USE_ODBC | ||||
| #include "asterisk.h" | ||||
|  | ||||
| ASTERISK_FILE_VERSION(__FILE__, "$Revision$") | ||||
| @@ -46,6 +47,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") | ||||
| #include "asterisk/res_odbc.h" | ||||
| #include "asterisk/app.h" | ||||
| #include "asterisk/cli.h" | ||||
| #include "asterisk/strings.h" | ||||
|  | ||||
| /*** DOCUMENTATION | ||||
| 	<function name="ODBC_FETCH" language="en_US"> | ||||
| @@ -281,8 +283,8 @@ static int acf_odbc_write(struct ast_channel *chan, const char *cmd, char *s, co | ||||
| 	/* Additionally set the value as a whole (but push an empty string if value is NULL) */ | ||||
| 	pbx_builtin_pushvar_helper(chan, "VALUE", value ? value : ""); | ||||
|  | ||||
| 	pbx_substitute_variables_helper(chan, query->sql_write, buf->str, buf->len - 1); | ||||
| 	pbx_substitute_variables_helper(chan, query->sql_insert, insertbuf->str, insertbuf->len - 1); | ||||
| 	ast_str_substitute_variables(&buf, 0, chan, query->sql_write); | ||||
| 	ast_str_substitute_variables(&insertbuf, 0, chan, query->sql_insert); | ||||
|  | ||||
| 	/* Restore prior values */ | ||||
| 	for (i = 0; i < args.argc; i++) { | ||||
| @@ -300,7 +302,7 @@ static int acf_odbc_write(struct ast_channel *chan, const char *cmd, char *s, co | ||||
| 		if (!ast_strlen_zero(query->writehandle[dsn])) { | ||||
| 			obj = ast_odbc_request_obj(query->writehandle[dsn], 0); | ||||
| 			if (obj) | ||||
| 				stmt = ast_odbc_direct_execute(obj, generic_execute, buf->str); | ||||
| 				stmt = ast_odbc_direct_execute(obj, generic_execute, ast_str_buffer(buf)); | ||||
| 		} | ||||
| 		if (stmt) { | ||||
| 			status = "SUCCESS"; | ||||
| @@ -309,14 +311,14 @@ static int acf_odbc_write(struct ast_channel *chan, const char *cmd, char *s, co | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if (stmt && rows == 0 && !ast_strlen_zero(insertbuf->str)) { | ||||
| 	if (stmt && rows == 0 && ast_str_strlen(insertbuf) != 0) { | ||||
| 		SQLCloseCursor(stmt); | ||||
| 		SQLFreeHandle(SQL_HANDLE_STMT, stmt); | ||||
| 		for (dsn = 0; dsn < 5; dsn++) { | ||||
| 			if (!ast_strlen_zero(query->writehandle[dsn])) { | ||||
| 				obj = ast_odbc_request_obj(query->writehandle[dsn], 0); | ||||
| 				if (obj) { | ||||
| 					stmt = ast_odbc_direct_execute(obj, generic_execute, insertbuf->str); | ||||
| 					stmt = ast_odbc_direct_execute(obj, generic_execute, ast_str_buffer(insertbuf)); | ||||
| 				} | ||||
| 			} | ||||
| 			if (stmt) { | ||||
| @@ -409,8 +411,7 @@ static int acf_odbc_read(struct ast_channel *chan, const char *cmd, char *s, cha | ||||
| 		pbx_builtin_pushvar_helper(chan, varname, args.field[x]); | ||||
| 	} | ||||
|  | ||||
| 	ast_str_make_space(&sql, strlen(query->sql_read) * 2 + 300); | ||||
| 	pbx_substitute_variables_helper(chan, query->sql_read, sql->str, sql->len - 1); | ||||
| 	ast_str_substitute_variables(&sql, 0, chan, query->sql_read); | ||||
|  | ||||
| 	/* Restore prior values */ | ||||
| 	for (x = 0; x < args.argc; x++) { | ||||
| @@ -435,7 +436,7 @@ static int acf_odbc_read(struct ast_channel *chan, const char *cmd, char *s, cha | ||||
| 		if (!ast_strlen_zero(query->readhandle[dsn])) { | ||||
| 			obj = ast_odbc_request_obj(query->readhandle[dsn], 0); | ||||
| 			if (obj) { | ||||
| 				stmt = ast_odbc_direct_execute(obj, generic_execute, sql->str); | ||||
| 				stmt = ast_odbc_direct_execute(obj, generic_execute, ast_str_buffer(sql)); | ||||
| 			} | ||||
| 		} | ||||
| 		if (stmt) { | ||||
| @@ -444,7 +445,7 @@ static int acf_odbc_read(struct ast_channel *chan, const char *cmd, char *s, cha | ||||
| 	} | ||||
|  | ||||
| 	if (!stmt) { | ||||
| 		ast_log(LOG_ERROR, "Unable to execute query [%s]\n", sql->str); | ||||
| 		ast_log(LOG_ERROR, "Unable to execute query [%s]\n", ast_str_buffer(sql)); | ||||
| 		if (obj) { | ||||
| 			ast_odbc_release_obj(obj); | ||||
| 		} | ||||
| @@ -460,7 +461,7 @@ static int acf_odbc_read(struct ast_channel *chan, const char *cmd, char *s, cha | ||||
|  | ||||
| 	res = SQLNumResultCols(stmt, &colcount); | ||||
| 	if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { | ||||
| 		ast_log(LOG_WARNING, "SQL Column Count error!\n[%s]\n\n", sql->str); | ||||
| 		ast_log(LOG_WARNING, "SQL Column Count error!\n[%s]\n\n", ast_str_buffer(sql)); | ||||
| 		SQLCloseCursor(stmt); | ||||
| 		SQLFreeHandle (SQL_HANDLE_STMT, stmt); | ||||
| 		ast_odbc_release_obj(obj); | ||||
| @@ -478,13 +479,13 @@ static int acf_odbc_read(struct ast_channel *chan, const char *cmd, char *s, cha | ||||
| 	if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { | ||||
| 		int res1 = -1; | ||||
| 		if (res == SQL_NO_DATA) { | ||||
| 			ast_verb(4, "Found no rows [%s]\n", sql->str); | ||||
| 			ast_verb(4, "Found no rows [%s]\n", ast_str_buffer(sql)); | ||||
| 			res1 = 0; | ||||
| 			buf[0] = '\0'; | ||||
| 			ast_copy_string(rowcount, "0", sizeof(rowcount)); | ||||
| 			status = "NODATA"; | ||||
| 		} else { | ||||
| 			ast_log(LOG_WARNING, "Error %d in FETCH [%s]\n", res, sql->str); | ||||
| 			ast_log(LOG_WARNING, "Error %d in FETCH [%s]\n", res, ast_str_buffer(sql)); | ||||
| 			status = "FETCHERROR"; | ||||
| 		} | ||||
| 		SQLCloseCursor(stmt); | ||||
| @@ -505,6 +506,7 @@ static int acf_odbc_read(struct ast_channel *chan, const char *cmd, char *s, cha | ||||
| 		for (x = 0; x < colcount; x++) { | ||||
| 			int i; | ||||
| 			struct ast_str *coldata = ast_str_thread_get(&coldata_buf, 16); | ||||
| 			char *ptrcoldata; | ||||
|  | ||||
| 			if (y == 0) { | ||||
| 				char colname[256]; | ||||
| @@ -516,30 +518,15 @@ static int acf_odbc_read(struct ast_channel *chan, const char *cmd, char *s, cha | ||||
| 					snprintf(colname, sizeof(colname), "field%d", x); | ||||
| 				} | ||||
|  | ||||
| 				if (coldata->len < maxcol + 1) { | ||||
| 					ast_str_make_space(&coldata, maxcol + 1); | ||||
| 				} | ||||
| 				ast_str_make_space(&coldata, maxcol + 1); | ||||
|  | ||||
| 				if (colnames->used) { | ||||
| 				if (ast_str_strlen(colnames)) { | ||||
| 					ast_str_append(&colnames, 0, ","); | ||||
| 				} | ||||
| 				ast_str_make_space(&colnames, strlen(colname) * 2 + 1 + colnames->used); | ||||
|  | ||||
| 				/* Copy data, encoding '\' and ',' for the argument parser */ | ||||
| 				for (i = 0; i < sizeof(colname); i++) { | ||||
| 					if (escapecommas && (colname[i] == '\\' || colname[i] == ',')) { | ||||
| 						colnames->str[colnames->used++] = '\\'; | ||||
| 					} | ||||
| 					colnames->str[colnames->used++] = colname[i]; | ||||
|  | ||||
| 					if (colname[i] == '\0') { | ||||
| 						colnames->used--; | ||||
| 						break; | ||||
| 					} | ||||
| 				} | ||||
| 				ast_str_append_escapecommas(&colnames, 0, colname, sizeof(colname)); | ||||
|  | ||||
| 				if (resultset) { | ||||
| 					void *tmp = ast_realloc(resultset, sizeof(*resultset) + colnames->used + 1); | ||||
| 					void *tmp = ast_realloc(resultset, sizeof(*resultset) + ast_str_strlen(colnames) + 1); | ||||
| 					if (!tmp) { | ||||
| 						ast_log(LOG_ERROR, "No space for a new resultset?\n"); | ||||
| 						ast_free(resultset); | ||||
| @@ -555,12 +542,12 @@ static int acf_odbc_read(struct ast_channel *chan, const char *cmd, char *s, cha | ||||
| 						return -1; | ||||
| 					} | ||||
| 					resultset = tmp; | ||||
| 					strcpy((char *)resultset + sizeof(*resultset), colnames->str); | ||||
| 					strcpy((char *)resultset + sizeof(*resultset), ast_str_buffer(colnames)); | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			buflen = strlen(buf); | ||||
| 			res = SQLGetData(stmt, x + 1, SQL_CHAR, coldata->str, coldata->len, &indicator); | ||||
| 			res = 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); | ||||
| @@ -568,39 +555,42 @@ static int acf_odbc_read(struct ast_channel *chan, const char *cmd, char *s, cha | ||||
| 			} | ||||
|  | ||||
| 			if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { | ||||
| 				ast_log(LOG_WARNING, "SQL Get Data error!\n[%s]\n\n", sql->str); | ||||
| 				ast_log(LOG_WARNING, "SQL Get Data error!\n[%s]\n\n", ast_str_buffer(sql)); | ||||
| 				y = -1; | ||||
| 				buf[0] = '\0'; | ||||
| 				goto end_acf_read; | ||||
| 			} | ||||
|  | ||||
| 			ast_debug(2, "Got coldata of '%s'\n", coldata->str); | ||||
| 			coldata->used = strlen(coldata->str); | ||||
| 			ast_debug(2, "Got coldata of '%s'\n", ast_str_buffer(coldata)); | ||||
|  | ||||
| 			/* Copy data, encoding '\' and ',' for the argument parser */ | ||||
| 			for (i = 0; i < coldata->used; i++) { | ||||
| 				if (escapecommas && (coldata->str[i] == '\\' || coldata->str[i] == ',')) { | ||||
| 					buf[buflen++] = '\\'; | ||||
| 				} | ||||
| 				buf[buflen++] = coldata->str[i]; | ||||
|  | ||||
| 				if (buflen >= len - 2) | ||||
| 					break; | ||||
|  | ||||
| 				if (coldata->str[i] == '\0') | ||||
| 					break; | ||||
| 			if (buflen) { | ||||
| 				buf[buflen++] = ','; | ||||
| 			} | ||||
|  | ||||
| 			/* Copy data, encoding '\' and ',' for the argument parser */ | ||||
| 			ptrcoldata = ast_str_buffer(coldata); | ||||
| 			for (i = 0; i < ast_str_strlen(coldata); i++) { | ||||
| 				if (escapecommas && (ptrcoldata[i] == '\\' || ptrcoldata[i] == ',')) { | ||||
| 					buf[buflen++] = '\\'; | ||||
| 				} | ||||
| 				buf[buflen++] = ptrcoldata[i]; | ||||
|  | ||||
| 				if (buflen >= len - 2) { | ||||
| 					break; | ||||
| 				} | ||||
|  | ||||
| 				if (ptrcoldata[i] == '\0') { | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			buf[buflen++] = ','; | ||||
| 			buf[buflen] = '\0'; | ||||
| 			ast_debug(2, "buf is now set to '%s'\n", buf); | ||||
| 		} | ||||
| 		/* Trim trailing comma */ | ||||
| 		buf[buflen - 1] = '\0'; | ||||
| 		ast_debug(2, "buf is now set to '%s'\n", buf); | ||||
|  | ||||
| 		if (resultset) { | ||||
| 			row = ast_calloc(1, sizeof(*row) + buflen); | ||||
| 			row = ast_calloc(1, sizeof(*row) + buflen + 1); | ||||
| 			if (!row) { | ||||
| 				ast_log(LOG_ERROR, "Unable to allocate space for more rows in this resultset.\n"); | ||||
| 				status = "MEMERROR"; | ||||
| @@ -612,8 +602,10 @@ static int acf_odbc_read(struct ast_channel *chan, const char *cmd, char *s, cha | ||||
| 			/* Get next row */ | ||||
| 			res = SQLFetch(stmt); | ||||
| 			if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { | ||||
| 				if (res != SQL_NO_DATA) | ||||
| 					ast_log(LOG_WARNING, "Error %d in FETCH [%s]\n", res, sql->str); | ||||
| 				if (res != SQL_NO_DATA) { | ||||
| 					ast_log(LOG_WARNING, "Error %d in FETCH [%s]\n", res, ast_str_buffer(sql)); | ||||
| 				} | ||||
| 				/* Number of rows in the resultset */ | ||||
| 				y++; | ||||
| 				break; | ||||
| 			} | ||||
| @@ -624,7 +616,7 @@ end_acf_read: | ||||
| 	snprintf(rowcount, sizeof(rowcount), "%d", y); | ||||
| 	pbx_builtin_setvar_helper(chan, "ODBCROWS", rowcount); | ||||
| 	pbx_builtin_setvar_helper(chan, "ODBCSTATUS", status); | ||||
| 	pbx_builtin_setvar_helper(chan, "~ODBCFIELDS~", colnames->str); | ||||
| 	pbx_builtin_setvar_helper(chan, "~ODBCFIELDS~", ast_str_buffer(colnames)); | ||||
| 	if (resultset) { | ||||
| 		int uid; | ||||
| 		struct ast_datastore *odbc_store; | ||||
| @@ -1042,8 +1034,7 @@ static char *cli_odbc_read(struct ast_cli_entry *e, int cmd, struct ast_cli_args | ||||
| 		pbx_builtin_pushvar_helper(chan, varname, args.field[i]); | ||||
| 	} | ||||
|  | ||||
| 	/*!\note This does not set sql->used, so don't try to use that value. */ | ||||
| 	pbx_substitute_variables_helper(chan, query->sql_read, sql->str, sql->len - 1); | ||||
| 	ast_str_substitute_variables(&sql, 0, chan, query->sql_read); | ||||
| 	ast_channel_free(chan); | ||||
|  | ||||
| 	if (a->argc == 5 && !strcmp(a->argv[4], "exec")) { | ||||
| @@ -1068,7 +1059,7 @@ static char *cli_odbc_read(struct ast_cli_entry *e, int cmd, struct ast_cli_args | ||||
| 			} | ||||
|  | ||||
| 			ast_debug(1, "Got obj\n"); | ||||
| 			if (!(stmt = ast_odbc_direct_execute(obj, generic_execute, sql->str))) { | ||||
| 			if (!(stmt = ast_odbc_direct_execute(obj, generic_execute, ast_str_buffer(sql)))) { | ||||
| 				ast_odbc_release_obj(obj); | ||||
| 				continue; | ||||
| 			} | ||||
| @@ -1077,7 +1068,7 @@ static char *cli_odbc_read(struct ast_cli_entry *e, int cmd, struct ast_cli_args | ||||
|  | ||||
| 			res = SQLNumResultCols(stmt, &colcount); | ||||
| 			if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { | ||||
| 				ast_cli(a->fd, "SQL Column Count error!\n[%s]\n\n", sql->str); | ||||
| 				ast_cli(a->fd, "SQL Column Count error!\n[%s]\n\n", ast_str_buffer(sql)); | ||||
| 				SQLCloseCursor(stmt); | ||||
| 				SQLFreeHandle (SQL_HANDLE_STMT, stmt); | ||||
| 				ast_odbc_release_obj(obj); | ||||
| @@ -1091,10 +1082,10 @@ static char *cli_odbc_read(struct ast_cli_entry *e, int cmd, struct ast_cli_args | ||||
| 				SQLFreeHandle(SQL_HANDLE_STMT, stmt); | ||||
| 				ast_odbc_release_obj(obj); | ||||
| 				if (res == SQL_NO_DATA) { | ||||
| 					ast_cli(a->fd, "Returned %d rows.  Query executed on handle %d:%s [%s]\n", rows, dsn, query->readhandle[dsn], sql->str); | ||||
| 					ast_cli(a->fd, "Returned %d rows.  Query executed on handle %d:%s [%s]\n", rows, dsn, query->readhandle[dsn], ast_str_buffer(sql)); | ||||
| 					break; | ||||
| 				} else { | ||||
| 					ast_cli(a->fd, "Error %d in FETCH [%s]\n", res, sql->str); | ||||
| 					ast_cli(a->fd, "Error %d in FETCH [%s]\n", res, ast_str_buffer(sql)); | ||||
| 				} | ||||
| 				AST_RWLIST_UNLOCK(&queries); | ||||
| 				return CLI_SUCCESS; | ||||
| @@ -1106,18 +1097,14 @@ static char *cli_odbc_read(struct ast_cli_entry *e, int cmd, struct ast_cli_args | ||||
| 						snprintf(colname, sizeof(colname), "field%d", x); | ||||
| 					} | ||||
|  | ||||
| 					if (coldata->len < maxcol + 1) { | ||||
| 						ast_str_make_space(&coldata, maxcol + 1); | ||||
| 					} | ||||
|  | ||||
| 					res = SQLGetData(stmt, x + 1, SQL_CHAR, coldata->str, coldata->len, &indicator); | ||||
| 					res = 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; | ||||
| 					} | ||||
|  | ||||
| 					if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { | ||||
| 						ast_cli(a->fd, "SQL Get Data error %d!\n[%s]\n\n", res, sql->str); | ||||
| 						ast_cli(a->fd, "SQL Get Data error %d!\n[%s]\n\n", res, ast_str_buffer(sql)); | ||||
| 						SQLCloseCursor(stmt); | ||||
| 						SQLFreeHandle(SQL_HANDLE_STMT, stmt); | ||||
| 						ast_odbc_release_obj(obj); | ||||
| @@ -1125,7 +1112,7 @@ static char *cli_odbc_read(struct ast_cli_entry *e, int cmd, struct ast_cli_args | ||||
| 						return CLI_SUCCESS; | ||||
| 					} | ||||
|  | ||||
| 					ast_cli(a->fd, "%-20.20s  %s\n", colname, coldata->str); | ||||
| 					ast_cli(a->fd, "%-20.20s  %s\n", colname, ast_str_buffer(coldata)); | ||||
| 				} | ||||
| 				/* Get next row */ | ||||
| 				res = SQLFetch(stmt); | ||||
| @@ -1144,10 +1131,10 @@ static char *cli_odbc_read(struct ast_cli_entry *e, int cmd, struct ast_cli_args | ||||
| 		ast_odbc_release_obj(obj); | ||||
|  | ||||
| 		if (!executed) { | ||||
| 			ast_cli(a->fd, "Failed to execute query. [%s]\n", sql->str); | ||||
| 			ast_cli(a->fd, "Failed to execute query. [%s]\n", ast_str_buffer(sql)); | ||||
| 		} | ||||
| 	} else { /* No execution, just print out the resulting SQL */ | ||||
| 		ast_cli(a->fd, "%s\n", sql->str); | ||||
| 		ast_cli(a->fd, "%s\n", ast_str_buffer(sql)); | ||||
| 	} | ||||
| 	AST_RWLIST_UNLOCK(&queries); | ||||
| 	return CLI_SUCCESS; | ||||
| @@ -1250,8 +1237,8 @@ static char *cli_odbc_write(struct ast_cli_entry *e, int cmd, struct ast_cli_arg | ||||
|  | ||||
| 	/* Additionally set the value as a whole (but push an empty string if value is NULL) */ | ||||
| 	pbx_builtin_pushvar_helper(chan, "VALUE", S_OR(a->argv[4], "")); | ||||
| 	pbx_substitute_variables_helper(chan, query->sql_write, sql->str, sql->len - 1); | ||||
| 	ast_debug(1, "SQL is %s\n", sql->str); | ||||
| 	ast_str_substitute_variables(&sql, 0, chan, query->sql_write); | ||||
| 	ast_debug(1, "SQL is %s\n", ast_str_buffer(sql)); | ||||
| 	ast_channel_free(chan); | ||||
|  | ||||
| 	if (a->argc == 6 && !strcmp(a->argv[5], "exec")) { | ||||
| @@ -1268,7 +1255,7 @@ static char *cli_odbc_write(struct ast_cli_entry *e, int cmd, struct ast_cli_arg | ||||
| 			if (!(obj = ast_odbc_request_obj(query->writehandle[dsn], 0))) { | ||||
| 				continue; | ||||
| 			} | ||||
| 			if (!(stmt = ast_odbc_direct_execute(obj, generic_execute, sql->str))) { | ||||
| 			if (!(stmt = ast_odbc_direct_execute(obj, generic_execute, ast_str_buffer(sql)))) { | ||||
| 				ast_odbc_release_obj(obj); | ||||
| 				continue; | ||||
| 			} | ||||
| @@ -1286,7 +1273,7 @@ static char *cli_odbc_write(struct ast_cli_entry *e, int cmd, struct ast_cli_arg | ||||
| 			ast_cli(a->fd, "Failed to execute query.\n"); | ||||
| 		} | ||||
| 	} else { /* No execution, just print out the resulting SQL */ | ||||
| 		ast_cli(a->fd, "%s\n", sql->str); | ||||
| 		ast_cli(a->fd, "%s\n", ast_str_buffer(sql)); | ||||
| 	} | ||||
| 	AST_RWLIST_UNLOCK(&queries); | ||||
| 	return CLI_SUCCESS; | ||||
|   | ||||
| @@ -141,24 +141,6 @@ AST_THREADSTORAGE(buf1); | ||||
| AST_THREADSTORAGE(buf2); | ||||
| AST_THREADSTORAGE(buf3); | ||||
|  | ||||
| static char *hash_escape(struct ast_str **str, const char *value) | ||||
| { | ||||
| 	int len; | ||||
| 	ast_str_reset(*str); | ||||
|  | ||||
| 	if ((*str)->len < (len = strlen(value) * 2 + 1)) { | ||||
| 		ast_str_make_space(str, len); | ||||
| 	} | ||||
| 	for (; *value; value++) { | ||||
| 		if (*value == ',' || *value == '\\') { | ||||
| 			(*str)->str[(*str)->used++] = '\\'; | ||||
| 		} | ||||
| 		(*str)->str[(*str)->used++] = *value; | ||||
| 	} | ||||
| 	(*str)->str[(*str)->used] = '\0'; | ||||
| 	return (*str)->str; | ||||
| } | ||||
|  | ||||
| static int function_realtime_read(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t len)  | ||||
| { | ||||
| 	struct ast_variable *var, *head; | ||||
| @@ -206,7 +188,7 @@ static int function_realtime_read(struct ast_channel *chan, const char *cmd, cha | ||||
| 	out = ast_str_alloca(resultslen); | ||||
| 	for (var = head; var; var = var->next) | ||||
| 		ast_str_append(&out, 0, "%s%s%s%s", var->name, args.delim2, var->value, args.delim1); | ||||
| 	ast_copy_string(buf, out->str, len); | ||||
| 	ast_copy_string(buf, ast_str_buffer(out), len); | ||||
|  | ||||
| 	if (chan) | ||||
| 		ast_autoservice_stop(chan); | ||||
| @@ -303,16 +285,16 @@ static int realtimefield_read(struct ast_channel *chan, const char *cmd, char *d | ||||
| 			} | ||||
| 		} else if (which == rthash) { | ||||
| 			ast_debug(1, "Setting hash key %s to value %s\n", var->name, var->value); | ||||
| 			ast_str_append(&fields, 0, "%s%s", first ? "" : ",", hash_escape(&escapebuf, var->name)); | ||||
| 			ast_str_append(&values, 0, "%s%s", first ? "" : ",", hash_escape(&escapebuf, var->value)); | ||||
| 			ast_str_append(&fields, 0, "%s%s", first ? "" : ",", ast_str_set_escapecommas(&escapebuf, 0, var->name, INT_MAX)); | ||||
| 			ast_str_append(&values, 0, "%s%s", first ? "" : ",", ast_str_set_escapecommas(&escapebuf, 0, var->value, INT_MAX)); | ||||
| 			first = 0; | ||||
| 		} | ||||
| 	} | ||||
| 	ast_variables_destroy(head); | ||||
|  | ||||
| 	if (which == rthash) { | ||||
| 		pbx_builtin_setvar_helper(chan, "~ODBCFIELDS~", fields->str); | ||||
| 		ast_copy_string(buf, values->str, len); | ||||
| 		pbx_builtin_setvar_helper(chan, "~ODBCFIELDS~", ast_str_buffer(fields)); | ||||
| 		ast_copy_string(buf, ast_str_buffer(values), len); | ||||
| 	} | ||||
|  | ||||
| 	if (chan) { | ||||
| @@ -418,7 +400,7 @@ static int function_realtime_readdestroy(struct ast_channel *chan, const char *c | ||||
| 	for (var = head; var; var = var->next) { | ||||
| 		ast_str_append(&out, 0, "%s%s%s%s", var->name, args.delim2, var->value, args.delim1); | ||||
| 	} | ||||
| 	ast_copy_string(buf, out->str, len); | ||||
| 	ast_copy_string(buf, ast_str_buffer(out), len); | ||||
|  | ||||
| 	ast_destroy_realtime(args.family, args.fieldmatch, args.value, SENTINEL); | ||||
|  | ||||
|   | ||||
| @@ -321,7 +321,7 @@ static int listfilter(struct ast_channel *chan, const char *cmd, char *parse, ch | ||||
| 	); | ||||
| 	const char *orig_list, *ptr; | ||||
| 	const char *begin, *cur, *next; | ||||
| 	int dlen, flen; | ||||
| 	int dlen, flen, first = 1; | ||||
| 	struct ast_str *result = ast_str_thread_get(&result_buf, 16); | ||||
| 	char *delim; | ||||
|  | ||||
| @@ -385,15 +385,12 @@ static int listfilter(struct ast_channel *chan, const char *cmd, char *parse, ch | ||||
| 			begin += flen + dlen; | ||||
| 		} else { | ||||
| 			/* Copy field to output */ | ||||
| 			if (result->used) { | ||||
| 			if (!first) { | ||||
| 				ast_str_append(&result, 0, "%s", delim); | ||||
| 			} | ||||
|  | ||||
| 			/* Have to do it this way, since we're not null-terminated. */ | ||||
| 			strncpy(result->str + result->used, begin, cur - begin); | ||||
| 			result->used += cur - begin; | ||||
| 			result->str[result->used] = '\0'; | ||||
|  | ||||
| 			ast_str_append_substr(&result, 0, begin, cur - begin + 1); | ||||
| 			first = 0; | ||||
| 			begin = cur + dlen; | ||||
| 		} | ||||
| 	} while (*cur != '\0'); | ||||
| @@ -401,7 +398,7 @@ static int listfilter(struct ast_channel *chan, const char *cmd, char *parse, ch | ||||
| 		ast_channel_unlock(chan); | ||||
| 	} | ||||
|  | ||||
| 	ast_copy_string(buf, result->str, len); | ||||
| 	ast_copy_string(buf, ast_str_buffer(result), len); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user