root / pykota / trunk / pykota / storages / sql.py @ 721

Revision 721, 6.2 kB (checked in by jalet, 21 years ago)

Forgotten import

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1# PyKota
2#
3# PyKota : Print Quotas for CUPS
4#
5# (c) 2003 Jerome Alet <alet@librelogiciel.com>
6# You're welcome to redistribute this software under the
7# terms of the GNU General Public Licence version 2.0
8# or, at your option, any higher version.
9#
10# You can read the complete GNU GPL in the file COPYING
11# which should come along with this software, or visit
12# the Free Software Foundation's WEB site http://www.fsf.org
13#
14# $Id$
15#
16# $Log$
17# Revision 1.9  2003/02/06 14:52:35  jalet
18# Forgotten import
19#
20# Revision 1.8  2003/02/06 14:49:04  jalet
21# edpykota should be ok now
22#
23# Revision 1.7  2003/02/06 14:28:59  jalet
24# edpykota should be ok, minus some typos
25#
26# Revision 1.6  2003/02/06 09:19:02  jalet
27# More robust behavior (hopefully) when the user or printer is not managed
28# correctly by the Quota System : e.g. cupsFilter added in ppd file, but
29# printer and/or user not 'yet?' in storage.
30#
31# Revision 1.5  2003/02/05 23:26:22  jalet
32# Incorrect handling of grace delay
33#
34# Revision 1.4  2003/02/05 23:02:10  jalet
35# Typo
36#
37# Revision 1.3  2003/02/05 23:00:12  jalet
38# Forgotten import
39# Bad datetime conversion
40#
41# Revision 1.2  2003/02/05 22:28:38  jalet
42# More robust storage
43#
44# Revision 1.1  2003/02/05 21:28:17  jalet
45# Initial import into CVS
46#
47#
48#
49
50import fnmatch
51
52class SQLStorage :   
53    def getMatchingPrinters(self, printerpattern) :
54        """Returns the list of all printer names which match a certain pattern."""
55        printerslist = []
56        # We 'could' do a SELECT printername FROM printers WHERE printername LIKE ...
57        # but we don't because other storages semantics may be different, so every
58        # storage should use fnmatch to match patterns and be storage agnostic
59        result = self.doQuery("SELECT printername FROM printers;")
60        result = self.doParseResult(result)
61        if result is not None :
62            for printer in result :
63                if fnmatch.fnmatchcase(printer["printername"], printerpattern) :
64                    printerslist.append(printer["printername"])
65        return printerslist       
66           
67    def getUserId(self, username) :
68        """Returns a userid given a username."""
69        result = self.doQuery("SELECT id FROM users WHERE username=%s;" % self.doQuote(username))
70        try :
71            return self.doParseResult(result)[0]["id"]
72        except TypeError :      # Not found
73            return
74           
75    def getPrinterId(self, printername) :       
76        """Returns a printerid given a printername."""
77        result = self.doQuery("SELECT id FROM printers WHERE printername=%s;" % self.doQuote(printername))
78        try :
79            return self.doParseResult(result)[0]["id"]
80        except TypeError :      # Not found   
81            return
82           
83    def getPrinterPageCounter(self, printername) :
84        """Returns the last page counter value for a printer given its name."""
85        result = self.doQuery("SELECT pagecounter, lastusername FROM printers WHERE printername=%s;" % self.doQuote(printername))
86        try :
87            return self.doParseResult(result)[0]
88        except TypeError :      # Not found
89            return
90       
91    def updatePrinterPageCounter(self, printername, username, pagecount) :
92        """Updates the last page counter information for a printer given its name, last username and pagecount."""
93        return self.doQuery("UPDATE printers SET pagecounter=%s, lastusername=%s WHERE printername=%s;" % (self.doQuote(pagecount), self.doQuote(username), self.doQuote(printername)))
94       
95    def addUserPQuota(self, username, printername) :
96        (userid, printerid) = self.getUPIds(username, printername)
97        if printerid is None :   
98            self.doQuery("INSERT INTO printers (printername) VALUES (%s);" % self.doQuote(printername))
99        if userid is None :   
100            self.doQuery("INSERT INTO users (username) VALUES (%s);" % self.doQuote(username))
101        (userid, printerid) = self.getUPIds(username, printername)
102        if (userid is not None) and (printerid is not None) :
103            return self.doQuery("INSERT INTO userpquota (userid, printerid) VALUES (%s, %s);" % (self.doQuote(userid), self.doQuote(printerid)))
104       
105    def getUPIds(self, username, printername) :   
106        """Returns a tuple (userid, printerid) given a username and a printername."""
107        return (self.getUserId(username), self.getPrinterId(printername))
108       
109    def getUserPQuota(self, username, printername) :
110        """Returns the Print Quota information for a given (username, printername)."""
111        (userid, printerid) = self.getUPIds(username, printername)
112        if (userid is not None) and (printerid is not None) :
113            result = self.doQuery("SELECT pagecounter, softlimit, hardlimit, datelimit FROM userpquota WHERE userid=%s AND printerid=%s;" % (self.doQuote(userid), self.doQuote(printerid)))
114            try :
115                return self.doParseResult(result)[0]
116            except TypeError :      # Not found   
117                pass
118       
119    def setUserPQuota(self, username, printername, softlimit, hardlimit) :
120        """Sets soft and hard limits for a user quota on a specific printer given (username, printername)."""
121        (userid, printerid) = self.getUPIds(username, printername)
122        if (userid is not None) and (printerid is not None) :
123            self.doQuery("UPDATE userpquota SET softlimit=%s, hardlimit=%s, datelimit=NULL WHERE userid=%s AND printerid=%s;" % (self.doQuote(softlimit), self.doQuote(hardlimit), self.doQuote(userid), self.doQuote(printerid)))
124       
125    def updateUserPQuota(self, username, printername, pagecount) :
126        """Updates the used user Quota information given (username, printername) and a job size in pages."""
127        (userid, printerid) = self.getUPIds(username, printername)
128        if (userid is not None) and (printerid is not None) :
129            self.doQuery("UPDATE userpquota SET pagecounter=pagecounter+(%s) WHERE userid=%s AND printerid=%s;" % (self.doQuote(pagecount), self.doQuote(userid), self.doQuote(printerid)))
130       
131    def buyUserPQuota(self, username, printername, pagebought) :
132        """Buys pages for a given (username, printername)."""
133        self.updateUserPQuota(username, printername, -pagebought)
134       
Note: See TracBrowser for help on using the browser.