from connection import Connection import crypt, string, re, os, types, urllib, psycopg class Basic(Connection): def init(self): cursor = self.connection.cursor() cursor.execute('''CREATE TABLE %s ( name TEXT, type TEXT, value TEXT, time TIMESTAMP, PRIMARY KEY (name, type) ) ''' % (self.name)) cursor.execute('''CREATE INDEX %s_index ON %s (value) ''' % (self.name, self.name)) cursor.close() return def kill(self): cursor = self.connection.cursor() try: cursor.execute('''DROP TABLE %s ''' % (self.name)) except Exception: pass cursor.close() return def addentry(self, name, type, value): cursor = self.connection.cursor() cursor.execute('''INSERT INTO %s(name, type, value, time) VALUES('%s', '%s', '%s', 'now') ''' % (self.name, name, type, self.quote(value))) cursor.close() return def delentry(self, name, type): cursor = self.connection.cursor() cursor.execute('''DELETE FROM %s WHERE name='%s' AND type='%s' ''' % (self.name, name, type)) cursor.close() return def delentries(self, name, type): cursor = self.connection.cursor() cursor.execute('''DELETE FROM %s WHERE name~'%s' AND type~'%s' ''' % (self.name, name, type)) cursor.close() return def getentry(self, name, type): cursor = self.connection.cursor() cursor.execute('''SELECT name, type, value, time FROM %s WHERE name='%s' AND type='%s' ''' % (self.name, name, type)) entry = cursor.dictfetchone() cursor.close() return entry def listentries(self, name, type): cursor = self.connection.cursor() cursor.execute('''SELECT name, type, value, time FROM %s WHERE name~'%s' AND type~'%s' ORDER BY name, type ''' % (self.name, name, type)) entries = cursor.dictfetchall() cursor.close() return entries def listnames(self, type='.*', name='.*', value='.*'): cursor = self.connection.cursor() cursor.execute('''SELECT DISTINCT name FROM %s WHERE type~'%s' AND name~'%s' AND value~'%s' ORDER BY name ''' % (self.name, type, name, value)) names = map(self.head, cursor.fetchall()) cursor.close() return names def listtypes(self, type='.*'): cursor = self.connection.cursor() cursor.execute('''SELECT DISTINCT type FROM %s WHERE type~'%s' ORDER BY type ''' % (self.name, type)) types = map(self.head, cursor.fetchall()) cursor.close() return types def setvalue(self, name, type, value): cursor = self.connection.cursor() cursor.execute('''UPDATE %s SET value='%s', time='now' WHERE name='%s' AND type='%s' ''' % (self.name, self.quote(value), name, type)) cursor.close() return def getvalue(self, name, type): cursor = self.connection.cursor() cursor.execute('''SELECT value FROM %s WHERE name='%s' AND type='%s' ''' % (self.name, name, type)) value = cursor.fetchall() cursor.close() if value: return value[0][0] else: return None def listvalues(self, name, type): cursor = self.connection.cursor() cursor.execute('''SELECT value FROM %s WHERE name~'%s' AND type~'%s' ''' % (self.name, name, type)) values = map(self.head, cursor.fetchall()) cursor.close() return values def dump(self, file): folder = os.path.dirname(file) if not os.path.isdir(folder): os.mkdir(folder) os.chmod(folder, 0777) cursor = self.connection.cursor() cursor.execute('''COPY %s TO '%s' ''' % (self.name, file)) cursor.close() return def load(self, file): cursor = self.connection.cursor() cursor.execute('''COPY %s FROM '%s' ''' % (self.name, file)) cursor.close() return def min(self, x, y): if x < y: return x return y def max(self, x, y): if x > y: return x return y def sort(self, list, reverse=None): list.sort() if reverse: list.reverse() return list def quote(self, value, javascript=None): if javascript: value = value.replace('\\', '\\\\') value = value.replace("'", '\\x27') value = value.replace('"', '\\x22') value = value.replace('\r', '') value = value.replace('\n', '\\n') return value if type(value) in (types.ListType,): for i in range(len(value)-1): value[i] = (re.sub('\t+', ' ', value[i])).strip() value = string.join(value, '\t') if type(value) in (types.StringType, types.InstanceType,): value = value.replace('\\', '\\\\') value = value.replace("'", "''") return value def cgiquote(self, value): return urllib.quote_plus(value) def pglist(self, value): if type(value) in (types.ListType,): return '{%s}' % (string.join(map(str, value), ',')) if type(value) in (types.StringType, types.InstanceType,): list = [] if len(value) > 1: for item in string.split(value[1:-1], ','): if item: list.append(int(item)) return list return None def pgdatetime(self, value): if type(value) in (types.StringType, types.InstanceType,): return psycopg.DATETIME(value) else: return str(value) return None def head(self, list): return list[0] def tail(self, list): return list[1:] def sort(self, list, by=None): if by == 'id': list.sort(self._by_id) elif by == 'name': list.sort(self._by_name) else: list.sort() return list def _by_id(self, left, right): (l, r) = (int(left['id']), int(right['id'])) if l < r: return -1 elif l > r: return 1 return 0 def _by_name(self, left, right): (l, r) = (left['name'], right['name']) if l < r: return -1 elif l > r: return 1 return 0 def sorthtml(self, left, right): left = string.lower(str(left)) left = re.sub('&(\w)uml;', '\\1e', left) left = re.sub('ß', 'ss', left) right = string.lower(str(right)) right = re.sub('&(\w)uml;', '\\1e', right) right = re.sub('ß', 'ss', right) if left < right: return -1 elif left > right: return 1 return 0 def text2date(self, text): if not re.match('^\d\d\d\d\d\d\d\d$', text): return text if text == '00010101': return '' return '%s.%s.%s' % (text[6:8], text[4:6], text[:4]) def date2text(self, date): if not re.match('^\d\d\.\d\d\.\d\d\d\d$', date): return date return '%s%s%s' % (date[6:10], date[3:5], date[:2]) def float2text(self, float): return re.sub(',$', ',0', re.sub('0+$', '', re.sub('\.', ',', '%f' % (float)))) def float2price(self, float): return re.sub('\.', ',', '%.2f' % (float)) def price2float(self, price): return float(string.join(string.split(price, ','), '.')) def is_valid_email(self, email): email = string.strip(email) if re.match('^[0-9a-zA-Z_&.%+-]+@([0-9a-zA-Z]([0-9a-zA-Z-]*[0-9a-zA-Z])?\.)+[a-zA-Z]{2,6}$', email): return 1 return 0