Как мне использовать DB Conn, сохраняющуюся в Apache, когда mod_dbd не поддерживает мой драйвер? - PullRequest
0 голосов
/ 03 сентября 2011

Я работаю с интерфейсом 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, чтобы добиться этого лучше?

Заранее спасибо!

1 Ответ

0 голосов
/ 16 апреля 2012

Я обнаружил, что не могу подключиться напрямую через приложение, но через саму библиотеку ODBTP. Благодаря тому, что это мост TCP-ODBC, он мог объединять соединения до некоторой степени, но недостаточно эффективно.

Я отказался от этой миссии и перешел на использование SQLite3 для базы данных приложения из-за изменения среды сервера.

...