我正在使用Linux Apache 2.x主机的SQL Server ODBTP接口。 mod_dbm不支持这个,我需要能够将代码移动到任何支持Apache的主机。
关于我的环境的说明:我使用的是Apache 2.2.17,用C语言编写的C ++ for Apache,ODBTP 1.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来更好地实现这一点的想法?
提前致谢!
答案 0 :(得分:0)
我发现我无法通过应用程序直接池,而是通过ODBTP库本身。由于它是一个TCP到ODBC桥,它能够将连接汇集到一定程度,但效率不高。
我已经放弃了这项任务,并且由于服务器环境的变化,已经开始将SQLite3用于应用程序数据库。