root / pykota / trunk / pykota / storages / pgstorage.py @ 2874

Revision 2874, 5.5 kB (checked in by jerome, 18 years ago)

Explicitely sets the default TCP ports to use, because it seems that once again, MySQL fails to be smart...

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
RevLine 
[1021]1# PyKota
[1144]2# -*- coding: ISO-8859-15 -*-
[1021]3#
4# PyKota : Print Quotas for CUPS and LPRng
5#
[2622]6# (c) 2003, 2004, 2005, 2006 Jerome Alet <alet@librelogiciel.com>
[1021]7# This program is free software; you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by
9# the Free Software Foundation; either version 2 of the License, or
10# (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program; if not, write to the Free Software
[2302]19# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
[1021]20#
21# $Id$
22#
[2033]23#
[1021]24
[2741]25import time
[2599]26from types import StringType
27
[2830]28from pykota.storage import PyKotaStorageError, BaseStorage
[1327]29from pykota.storages.sql import SQLStorage
[1021]30
31try :
32    import pg
33except ImportError :   
34    import sys
35    # TODO : to translate or not to translate ?
36    raise PyKotaStorageError, "This python version (%s) doesn't seem to have the PygreSQL module installed correctly." % sys.version.split()[0]
[2031]37else :   
38    try :
39        PGError = pg.Error
40    except AttributeError :   
41        PGError = pg.error
[1021]42
[1327]43class Storage(BaseStorage, SQLStorage) :
[1021]44    def __init__(self, pykotatool, host, dbname, user, passwd) :
45        """Opens the PostgreSQL database connection."""
[1130]46        BaseStorage.__init__(self, pykotatool)
[1021]47        try :
48            (host, port) = host.split(":")
49            port = int(port)
50        except ValueError :   
[2874]51            port = 5432         # Use PostgreSQL's default tcp/ip port (5432).
[1021]52       
[2418]53        self.tool.logdebug("Trying to open database (host=%s, port=%s, dbname=%s, user=%s)..." % (host, port, dbname, user))
[2210]54        self.database = pg.connect(host=host, port=port, dbname=dbname, user=user, passwd=passwd)
55        self.closed = 0
56        self.tool.logdebug("Database opened (host=%s, port=%s, dbname=%s, user=%s)" % (host, port, dbname, user))
[1021]57           
[1113]58    def close(self) :   
[1021]59        """Closes the database connection."""
60        if not self.closed :
61            self.database.close()
62            self.closed = 1
[1130]63            self.tool.logdebug("Database closed.")
[1021]64       
[1041]65    def beginTransaction(self) :   
66        """Starts a transaction."""
[2741]67        self.before = time.time()
[1041]68        self.database.query("BEGIN;")
[1130]69        self.tool.logdebug("Transaction begins...")
[1041]70       
71    def commitTransaction(self) :   
72        """Commits a transaction."""
73        self.database.query("COMMIT;")
[2741]74        after = time.time()
[1130]75        self.tool.logdebug("Transaction committed.")
[2741]76        self.tool.logdebug("Transaction duration : %.4f seconds" % (after - self.before))
[1041]77       
78    def rollbackTransaction(self) :     
79        """Rollbacks a transaction."""
80        self.database.query("ROLLBACK;")
[2741]81        after = time.time()
[1130]82        self.tool.logdebug("Transaction aborted.")
[2741]83        self.tool.logdebug("Transaction duration : %.4f seconds" % (after - self.before))
[1041]84       
[1717]85    def doRawSearch(self, query) :
86        """Does a raw search query."""
[1021]87        query = query.strip()   
88        if not query.endswith(';') :   
89            query += ';'
90        try :
[2741]91            before = time.time()
[1130]92            self.tool.logdebug("QUERY : %s" % query)
[1021]93            result = self.database.query(query)
[2031]94        except PGError, msg :   
[2033]95            raise PyKotaStorageError, str(msg)
[1021]96        else :   
[2741]97            after = time.time()
98            self.tool.logdebug("Query Duration : %.4f seconds" % (after - before))
[1717]99            return result
[1041]100           
[1717]101    def doSearch(self, query) :       
102        """Does a search query."""
103        result = self.doRawSearch(query)
104        if (result is not None) and (result.ntuples() > 0) : 
105            return result.dictresult()
106       
[1041]107    def doModify(self, query) :
108        """Does a (possibly multiple) modify query."""
109        query = query.strip()   
110        if not query.endswith(';') :   
111            query += ';'
112        try :
[2741]113            before = time.time()
[1130]114            self.tool.logdebug("QUERY : %s" % query)
[1041]115            result = self.database.query(query)
[2031]116        except PGError, msg :   
[2773]117            self.tool.logdebug("Query failed : %s" % repr(msg))
[2033]118            raise PyKotaStorageError, str(msg)
[1068]119        else :   
[2741]120            after = time.time()
121            self.tool.logdebug("Query Duration : %.4f seconds" % (after - before))
[1068]122            return result
[1041]123           
[1021]124    def doQuote(self, field) :
125        """Quotes a field for use as a string in SQL queries."""
126        if type(field) == type(0.0) : 
127            typ = "decimal"
128        elif type(field) == type(0) :   
129            typ = "int"
[1520]130        elif type(field) == type(0L) :   
131            typ = "int"
[1021]132        else :   
133            typ = "text"
134        return pg._quote(field, typ)
[2593]135       
136    def prepareRawResult(self, result) :
137        """Prepares a raw result by including the headers."""
138        if result.ntuples() > 0 :
139            entries = [result.listfields()]
140            entries.extend(result.getresult())
141            nbfields = len(entries[0])
142            for i in range(1, len(entries)) :
143                fields = list(entries[i])
144                for j in range(nbfields) :
145                    field = fields[j]
146                    if type(field) == StringType :
147                        fields[j] = self.databaseToUserCharset(field) 
148                entries[i] = tuple(fields)   
149            return entries
150       
Note: See TracBrowser for help on using the browser.