2011-09-21 1 views
3

을 실행하기 전에 PostgreSQL의 쿼리를 다시 작성하는 방법을 찾고 난 포스트 그레스 클라이언트가 우리의 포스트 그레스 서버에

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

같은 쿼리를 전송합니다. 클라이언트가 전체 텍스트 검색 기능을 사용하길 원하지만 클라이언트의 코드에 액세스 할 수 없습니다. 그래서 내가 좋아하는 뭔가 위의 형태로 들어오는 모든 쿼리를 다시 작성하는 방법을 찾고 있어요 :

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

참고 'SEARCH_STRING'의 추출, 그래서 포스트 그레스 규칙이 될 수 있도록하지 않기 때문에 여기에 사용할 수 없습니다 추출. 누구든지 쿼리 재 작성을 할 수있는 postgres 미들웨어 또는 프록시를 알고 있거나 다른 좋은 아이디어가 있습니까? 고맙습니다.

+0

이론적으로 규칙은 문장을 다시 쓰려고하지만 SQL 문을 다시 작성해야하는지 여부를 알아낼 수는 없다고 생각합니다. –

답변

0

은 내가 내 자신의 질문에 대답 할 생각 manges 문자열에 대한 기능의 완전한 세트를 제공합니다. 나는 python gevent socket programming을 사용하여 쿼리를 다시 작성하기위한 postgres 프록시 서버를 구현했습니다. 연결에서 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() 
-1

tou가 데이터베이스 서버에서 실행중인 SQL 함수 (postgres sql dialect 다음)로 full_text_search를 다시 쓸 수 있는지 궁금합니다. 실제로 포스트 그레스

http://www.postgresql.org/docs/9.0/static/functions-string.html

+0

다른 기능을 사용하는 클라이언트의 문제는 해결되지 않습니다. –