Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не пойму кое-что в функции mysql_escape_string. Часть 1. / 1 сообщений из 1, страница 1 из 1
27.10.2003, 06:22
    #32305547
Disturbed
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не пойму кое-что в функции mysql_escape_string. Часть 1.
Greetings.

Занятную проблему нашел я себе на задницу. Такую:
Пишу интерфейс на VC++ 7.0 для базы данных, находящейся под MySQL 4.0.15a. С базой контактирую используя ODBC. В одну из таблиц надо грузить картинки (*.jpg, *.gif). Вскочил вопрос - cock? Шить к проге библиотеку libmySQL.dll ради одной единственной функции mysql_escape_string() не хочется. Да и пришьется ли она? Полез на www.mysql.com, скачал исходник Мускула и нашел в нем реализацию упомянутой функции. Служит она, как Вы наверное знаете, для экранирования в буфере опасных символов, перед отправкой его содержимого в BLOB-поле таблицы. Вот она:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
ulong STDCALL mysql_escape_string(char* to, const char* from, ulong length)
{
	return mysql_sub_escape_string(default_charset_info, to, from, length);
}

static ulong mysql_sub_escape_string(CHARSET_INFO* charset_info, char* to,
	const char* from, ulong length)
{
	const char* to_start = to;
	const char* end;
#ifdef USE_MB
	my_bool use_mb_flag = use_mb(charset_info);	 /* TRUE если в текущем наборе символов есть многобайтовые. */ 
#endif
	 /* До тех пор, пока не будет достигнут байт, следующий за последним байтом буфера. */ 
	for (end = from + length; from != end; from++)
	{
#ifdef USE_MB
		int l;
		 /* Если байт, на который указывает  from,  есть часть многобайтового символа,
			вернуть в переменную l общее число байт этого символа. */ 
if (use_mb_flag && (l = my_ismbchar(charset_info, from, end)))
 {
	while (l --)
 
	*to++ = *from++;	 /* Сохранить в  to  все байты многобайтового символа. */ 
		from --; 
 
 /* Вернуться на первый (возможно единственный) байт символа, следующего сразу за многобайтовым */ 
	continue;	 /* Покинуть текущую итерацию цикла  for */ 
	}
#endif
		switch (*from)
		{
		case  0 :
			 /* Must be escaped for 'mysql' */ 
			*to++ = '\\';
			*to++ = '0';
			break;
		case '\n':
			 /* Must be escaped for logs */ 
			*to++ = '\\';
			*to++ = 'n';
			break;
		case '\r':
			*to++ = '\\';
			*to++ = 'r';
			break;
		case '\\':
			*to++ = '\\';
			*to++ = '\\';
			break;
		case '\'':
			*to++ = '\\'; Апостроф
			*to++ = '\'';
			break;
		case '"':
			 /* Кавычка */ 
			*to++ = '\\';
			*to++ = '"';
			break;
		case '\032':
			 /* Ctrl-Z. This gives problems on Win32 */ 
			*to++ = '\\';
			*to++ = 'Z';
			break;
		default:
			*to++ = *from;	  /* Любой неопасный символ */ 
		}
	}
	*to =  0 ;	 /* Последним ставится разрыв строки */ 
	return (ulong) (to - to_start);	 /* Длина  to  за вычетом разрыва строки */ 
}


Прежде всего, функция работает прекрасно. Но кое-что в ее реализации меня настораживает. А именно:

1. Зачем может понадобиться в каждой итерации цикла for узнавать значение флага use_mb_flag ?

if (use_mb_flag && (l = my_ismbchar(charset_info, from, end)))
Он устанавливается один раз в начале функции и значения больше не меняет.

2. Почему не прослешиваются многобайтовые символы? Что если частью многобайтового символа окажется \0 или \ или ' и т.п. ?

Это, собственно, еще не проблема. Проблема будет позже :) Сначала, мне хотелось бы услышать Ваше мнение на эти два вопроса.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Не пойму кое-что в функции mysql_escape_string. Часть 1. / 1 сообщений из 1, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]