Skip to content

Commit

Permalink
Implement databases <section> latest|oldest, to only list latest or o…
Browse files Browse the repository at this point in the history
…ldest existing database
  • Loading branch information
dimitri committed Mar 14, 2011
1 parent 61526a9 commit 07e3e58
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 11 deletions.
7 changes: 4 additions & 3 deletions pg_staging.1.txt
Expand Up @@ -155,7 +155,7 @@ postsql <dbname> [<YYYYMMDD>]::

=== listings ===

databases [<dbname>]::
databases [<dbname>] [oldest|latest]::

Show the list of database sections parsed into the .ini file. When
given a +<dbname>+ show the list of known databases from +pgbouncer+.
Expand Down Expand Up @@ -183,9 +183,10 @@ show <dbname> [<YYYYMMDD>] <setting>::

=== pgbouncer ===

pgbouncer <dbname>::
pgbouncer <dbname> [oldest|latest]::

Show +pgbouncer+ database listing for given dbname.
Show +pgbouncer+ database listing for given dbname. When given
+oldest+ or +latest+, only display this one database line.

pause <dbname> [<YYYMMDD>]::

Expand Down
17 changes: 13 additions & 4 deletions pgstaging/commands.py
Expand Up @@ -417,7 +417,7 @@ def list_databases(conffile, args):
for section in config.sections():
print section

elif len(args) == 1:
elif len(args) in (1, 2):
list_pgbouncer_databases(conffile, args)

else:
Expand Down Expand Up @@ -529,14 +529,23 @@ def show_all_dbsizes(conffile, args):

def list_pgbouncer_databases(conffile, args):
""" list configured pgbouncer databases """
usage = "pgbouncer <dbname>"
if len(args) != 1:
usage = "pgbouncer <dbname> [oldest|latest]"
if len(args) not in (1, 2) or \
(len(args) == 2 and args[1] not in ('oldest', 'latest')):
raise WrongNumberOfArgumentsException, usage

target = None
dbname = args[0]
staging = parse_config(conffile, dbname)

if len(args) == 2 and args[1] == 'oldest':
target = staging.get_oldest_dbname()
elif len(args) == 2 and args[1] == 'latest':
target = staging.get_latest_dbname()

for name, database, host, port in staging.pgbouncer_databases():
print "%25s %25s %s:%s" % (name, database, host, port)
if target is None or name == target:
print "%25s %25s %s:%s" % (name, database, host, port)

def pause_pgbouncer_database(conffile, args):
""" pause <dbname> [date] (when no date given, not expanded to today) """
Expand Down
40 changes: 36 additions & 4 deletions pgstaging/staging.py
Expand Up @@ -167,6 +167,10 @@ def parse_backup_file_date(self, filename):
""" extract date from foo_db.2011-03-11.dump """
return self.parse_date(filename.split(".")[1])

def parse_dbname_date(self, dbname):
""" extract date from allopass_db_20100209 """
return self.parse_date(dbname.split("_")[-1])

def get_latest_backup(self):
""" return the latest backup date available """
b = None
Expand Down Expand Up @@ -638,16 +642,44 @@ def drop(self, dbname = None):
# and remove it from pgbouncer configuration
self.pgbouncer_del_database(dbname)

def purge(self):
""" keep only self.keep_bases databases """
from options import TERSE, VERBOSE

def pgbouncer_dbnames(self):
"""return sorted list of databases available in pgbouncer and
matching self.dbname
"""
dlist = [d[1].strip('"')
for d in self.pgbouncer_databases()
if d[0].strip('"') != self.dbname \
and d[1].strip('"').startswith(self.dbname)]
dlist.sort()

return dlist

def get_latest_dbname(self):
""" return the oldest available (through pgbouncer) """
latest = None
for dbname in self.pgbouncer_dbnames():
d = self.parse_dbname_date(dbname)
if latest is None or d > latest[0]:
latest = d, dbname

return latest[1]

def get_oldest_dbname(self):
""" return the oldest available (through pgbouncer) """
oldest = None
for dbname in self.pgbouncer_dbnames():
d = self.parse_dbname_date(dbname)
if oldest is None or d < oldest[0]:
oldest = d, dbname

return oldest[1]

def purge(self):
""" keep only self.keep_bases databases """
from options import TERSE, VERBOSE

dlist = self.pgbouncer_dbnames()

if len(dlist) <= self.keep_bases:
if not TERSE:
print "cleandb: we keep %d databases and have only %d" %\
Expand Down

0 comments on commit 07e3e58

Please sign in to comment.