Ищите способ переписать запрос Postgresql перед его выполнением - PullRequest
3 голосов
/ 21 сентября 2011

У меня есть клиент Postgres, отправляющий запросы типа

SELECT ... FROM "public"."mycontent" "mycontent"
WHERE (strpos(substring("mycontent"."summary" from 1), 'search_string') + 1 - 1 > 0)

на наш сервер Postgres.Я хочу, чтобы клиент использовал мою функцию полнотекстового поиска, но у меня нет доступа к коду клиента.Поэтому я ищу способ переписать все входящие запросы в приведенной выше форме в нечто вроде:

SELECT ... FROM "public"."mycontent" "mycontent"
WHERE id in full_text_search('search_string')

Обратите внимание на извлечение 'search_string', поэтому правила Postgres здесь нельзя использовать, потому что они несделать такое извлечение.Я надеюсь, что кто-нибудь знает о любом промежуточном программном обеспечении или прокси-сервере postgres, которое может переписать запросы, или есть какая-то другая идея?Спасибо.

Ответы [ 2 ]

2 голосов
/ 26 сентября 2011

Полагаю, я должен ответить на свой вопрос.Я реализовал прокси-сервер postgres для переписывания запросов, используя программирование сокетов Python Gevent.Обратите внимание, что это не работает, если соединение использует SSL.

from gevent import socket, server, Greenlet, joinall

def pipe(source_socket, destination_socket, modify=False):
    while True:
        try:
            data = source_socket.recv(1024)
        except socket.error, e:
            break
        else:
            if data:
                if modify: data = data.replace("limit 10", "limit 1 ")
                destination_socket.send(data)
            else:
                break

def pg_proxy(client_socket, address):
    pg_socket = socket.create_connection(("localhost", 5432))
    pg_socket.settimeout(300.0)
    client_socket.settimeout(300.0)
    joinall((
        Greenlet.spawn(pipe, client_socket, pg_socket, modify=True),
        Greenlet.spawn(pipe, pg_socket, client_socket, modify=False)
    ))
    pg_socket.close()
    client_socket.close()

if __name__ == '__main__':
    s = server.StreamServer(("localhost", 5433), pg_proxy)
    s.serve_forever()
0 голосов
/ 21 сентября 2011

Интересно, можно ли переписать full_text_search как функцию SQL (после диалекта postgres sql), выполняемую на сервере базы данных.

фактически postgres предоставляет полный набор функций для управления строками http://www.postgresql.org/docs/9.0/static/functions-string.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...