Я работаю с интерфейсом ODBTP к SQL Server с хоста Linux Apache 2.x.mod_dbm не поддерживает это, и мне нужно иметь возможность перемещать код на любой хост, поддерживающий Apache.
Примечание в моей среде: я использую Apache 2.2.17, C ++, обернутый в C для Apache, ODBTP1.14, SQL Server 2008.
Я успешно реализовал соединения ODBTP и могу полностью использовать данные в самом модуле, но я хотел сохранить соединения довольно непрерывно, соединяясь, разъединяясь и перезапускаясьдля моего приложения, которое использует локальные HTTP-вызовы для извлечения данных в формате JSON.
Проблема заключается в том, что мне нужно развернуть это приложение и модуль в среде, где я не доверяю безопасности написанного простого текстаприложение, чтобы безопасно охранять учетные данные базы данных.Когда приложение подключается по HTTP, оно предоставляет только зашифрованные учетные данные, которые мой модуль расшифровывает перед отправкой в базу данных.
В настоящее время я создаю дескриптор базы данных и сохраняю его в таблице с ключом apr_hash_t в определении модуля.Как только приложение подключается, модуль ищет уникальный маркер для каждого запроса, который приложение указывает в URL-адресе, чтобы найти соединение для этого приложения.Это работает, но только один раз.
Хеш-ключ - это 32-значный ключ, который изначально представляет собой char *, созданный из пула и сохраненный с дескриптором ODBTP в виде строки в хеш-таблице.Как-то так, ключ между вызовами изменяется, и оригинальный ключ теперь является усеченной версией.
Пример: 1) Я выполняю 1 звонок из своего приложения, чтобы установить постоянное соединение.Это работает.2) Я делаю 3 параллельных вызова из моего приложения, чтобы выполнить строку SQL.(/ stars / execute_sql / unique / <> / sql / <>) x 3
Первый вызов идеален, и я получаю данные.При следующем вызове токен, сохраненный как ключ, усекается, и модуль не может найти связанный ключ.При следующем вызове токен находится в том же усеченном состоянии, что и при попытке 2.
Я не уверен, перезаписываю ли я память или нет?Я написал функцию с коротким циклом, чтобы выплевывать содержимое хеш-таблицы, чтобы я мог прикрепить функцию в каждой точке моего кода, чтобы выяснить, где данные могли быть повреждены, но мои выводы не имеют смысла.Я должен разделить URI, чтобы найти данные, встроенные в URI.Я отслеживал смещение памяти в этой функции в строку как «raw = apr_psprintf (apache-> pool,«% s », subject);»который находится в приведенном ниже коде.
void theRequest::get_exploded_str(char *subject, char *delimiter)
{
// variables
char *raw, *next, *last;
// create the split chars database if not created
loadSDB();
apr_array_clear(x_split_chars);
subject = apr_pstrndup(apache->pool, subject, string(subject).length());
raw = apr_psprintf(apache->pool,"%s", subject);
next = (char*)apr_strtok(raw, delimiter, &last);
while (next)
{
// add next to array
*(char **) apr_array_push(x_split_chars) = apr_pstrdup(apache->pool, next);
// fetch next
next = (char*)apr_strtok(NULL, delimiter, &last);
}
return;
};
Он отлично работает при вызове 1, но не при вызове 2, потому что ключ как-то сдвигается.
Есть идеи?Или даже некоторые мысли о том, как я мог бы использовать APR_RESLIST, чтобы добиться этого лучше?
Заранее спасибо!