2011-09-21 49 views
3

之前重寫PostgreSQL的查詢我有一個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中間件或代理,或者還有其他更好的主意嗎?謝謝。

+0

從理論上來說RULE可以重寫語句,但我不認爲他們可以查看SQL文本以確定它是否應該被重寫。 –

回答

0

我想我必須回答我的問題。我使用python gevent套接字編程實現了一個用於重寫查詢的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() 
相關問題