在C中的postgres扩展中获取原始sql查询

时间:2014-02-04 13:26:59

标签: sql c postgresql

我正在用C(c ++)创建postgres的扩展。它是一种新的数据类型,其行为类似于文本,但它由HSM设备加密。但是我有一个问题就是使用一个以上的密钥来保护数据。我的想法是获得原始的SQL查询并处理它以选择我应该使用的密钥。但我不知道该怎么做,或者甚至可能吗?

我的目标是将数据库中的一些现有文本字段更改为加密文本字段。这就是我不能直接为我的类型提供密钥号码的原因。外部应用程序必须将类型视为文本。

通常有userID字段,单个查询总是使用该id来获取或设置加密数据。基于该字段我想选择密钥。 HSM本身可以拥有数十亿个密钥,这意味着每个用户都可以拥有自己的密钥。如果我需要自己解析字符串,这不是问题,我更有能力做到这一点。性能也不是问题,HSM速度太快,我只能在一秒内编码或解码几个字段。

1 个答案:

答案 0 :(得分:1)

在规划器和执行器的大多数部分中,当前(子)查询在传递的PlannerInfo结构中可用,通常是:

PlannerInfo *root

这个parse成员包含Query对象。

在系统的早期,在重写器中,它直接作为Query *root传递。

在这两种情况下,如果对嵌套子查询进行评估,则会得到子查询。没有简单的方法可以访问父Query节点。

查询树并不总是在执行路径中更深入,例如在表达式评估中。你不应该在那里指它;表达式是自包含的,不需要引用查询的其余部分。

所以你在做你想做的事情时会遇到问题。坦率地说,这是因为声音设计非常糟糕。您应该考虑的是:

  • 使用函数对明文进行编码/解码,允许您传递参数;或者可能

  • 使用该类型的typmod存储所需信息(但请注意,不会在演员表,子查询等中保留typmod)。

还有debug_query_string全局,但真的没有使用它。它是未解析的查询文本,因此无论如何它都不会帮助您。如果你(ab)在你的代码中使用它,我会哭。我只是告诉你它存在所以我可以告诉你不要使用它。

到目前为止,您最好的选择是使用基于功能的界面。