def _get_installed_version(self): """Return current version of schema or None if not any found. """ query = "SELECT tablename FROM pg_tables WHERE tablename = 'metadata';" with self.client.connect() as conn: result = conn.execute(query) tables_exist = result.rowcount > 0 if not tables_exist: return query = """ SELECT value AS version FROM metadata WHERE name = 'storage_schema_version' ORDER BY LPAD(value, 3, '0') DESC; """ with self.client.connect() as conn: result = conn.execute(query) if result.rowcount > 0: return int(result.fetchone()['version']) else: # Guess current version. query = "SELECT COUNT(*) FROM metadata;" result = conn.execute(query) was_flushed = int(result.fetchone()[0]) == 0 if was_flushed: error_msg = 'Missing schema history: consider version %s.' logger.warning(error_msg % self.schema_version) return self.schema_version # In the first versions of Cliquet, there was no migration. return 1
def _check_database_timezone(self): # Make sure database has UTC timezone. query = "SELECT current_setting('TIMEZONE') AS timezone;" with self.client.connect() as conn: result = conn.execute(query) record = result.fetchone() timezone = record['timezone'].upper() if timezone != 'UTC': # pragma: no cover msg = 'Database timezone is not UTC (%s)' % timezone warnings.warn(msg) logger.warning(msg)
def set(self, key, value, ttl=None): if ttl is None: logger.warning("No TTL for cache key %r" % key) query = """ INSERT INTO cache (key, value, ttl) VALUES (:key, :value, sec2ttl(:ttl)) ON CONFLICT (key) DO UPDATE SET value = :value, ttl = sec2ttl(:ttl); """ value = json.dumps(value) with self.client.connect() as conn: conn.execute(query, dict(key=self.prefix + key, value=value, ttl=ttl))
def set(self, key, value, ttl=None): if ttl is None: logger.warning("No TTL for cache key %r" % key) query = """ WITH upsert AS ( UPDATE cache SET value = :value, ttl = sec2ttl(:ttl) WHERE key=:key RETURNING *) INSERT INTO cache (key, value, ttl) SELECT :key, :value, sec2ttl(:ttl) WHERE NOT EXISTS (SELECT * FROM upsert) """ value = json.dumps(value) with self.client.connect() as conn: conn.execute(query, dict(key=self.prefix + key, value=value, ttl=ttl))