driver.py 6.04 KB
Newer Older
1
2
3
4
#!/usr/bin/env python
# vim: set fileencoding=utf-8 :
# Laurent El Shafey <laurent.el-shafey@idiap.ch>

5
"""Bob Database Driver entry-point for the Biosecure database
6
7
8
9
10
11
"""

import os
import sys
from bob.db.driver import Interface as BaseInterface

12
13
14
15
16
# Driver API
# ==========

def dumplist(args):
  """Dumps lists of files based on your criteria"""
17
18
19
20

  from .query import Database
  db = Database()

21
22
23
24
25
26
27
28
  r = db.objects(
      protocol=args.protocol,
      purposes=args.purpose,
      model_ids=args.client,
      groups=args.group,
      classes=args.sclass
  )

29
30
31
32
33
  output = sys.stdout
  if args.selftest:
    from bob.db.utils import null
    output = null()

34
35
  for f in r:
    output.write('%s\n' % (f.make_path(args.directory, args.extension),))
36
37
38
39

  return 0


40
41
def checkfiles(args):
  """Checks existence of files based on your criteria"""
42

43
44
  from .query import Database
  db = Database()
45

46
  r = db.objects()
47

48
49
50
51
52
53
54
55
  # go through all files, check if they are available on the filesystem
  good = []
  bad = []
  for f in r:
    if os.path.exists(f.make_path(args.directory, args.extension)):
      good.append(f)
    else:
      bad.append(f)
56

57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
  # report
  output = sys.stdout
  if args.selftest:
    from bob.db.utils import null
    output = null()

  if bad:
    for f in bad:
      output.write('Cannot find file "%s"\n' % (f.make_path(args.directory, args.extension),))
    output.write('%d files (out of %d) were not found at "%s"\n' % \
        (len(bad), len(r), args.directory))

  return 0


def reverse(args):
  """Returns a list of file database identifiers given the path stems"""
74
75
76
77
78
79
80
81
82

  from .query import Database
  db = Database()

  output = sys.stdout
  if args.selftest:
    from bob.db.utils import null
    output = null()

83
  r = db.reverse(args.path)
84
  for f in r: output.write('%d\n' % f.id)
85
86
87
88
89

  if not r: return 1

  return 0

90
91
def path(args):
  """Returns a list of fully formed paths or stems given some file id"""
92

93
94
  from .query import Database
  db = Database()
95

96
97
98
99
  output = sys.stdout
  if args.selftest:
    from bob.db.utils import null
    output = null()
100

101
102
  r = db.paths(args.id, prefix=args.directory, suffix=args.extension)
  for path in r: output.write('%s\n' % path)
103

104
  if not r: return 1
105

106
  return 0
107
108


109
class Interface(BaseInterface):
110

111
112
  def name(self):
    return 'biosecure'
113

114
115
116
  def version(self):
    import pkg_resources  # part of setuptools
    return pkg_resources.require('xbob.db.%s' % self.name())[0].version
117

118
119
120
121
122
123
124
125
126
127
128
129
  def files(self):

    from pkg_resources import resource_filename
    raw_files = ('db.sql3',)
    return [resource_filename(__name__, k) for k in raw_files]

  def type(self):
    return 'sqlite'

  def add_commands(self, parser):

    from . import __doc__ as docs
130

131
132
133
    subparsers = self.setup_parser(parser,
        "Biosecure database", docs)

134
    # the "create" action from a submodule
135
136
137
    from .create import add_command as create_command
    create_command(subparsers)

138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
    from .query import Database
    import argparse
    db = Database()

    # the "dumplist" action
    parser = subparsers.add_parser('dumplist', help=dumplist.__doc__)
    parser.add_argument('-d', '--directory', help="if given, this path will be prepended to every entry returned.")
    parser.add_argument('-e', '--extension', help="if given, this extension will be appended to every entry returned.")
    parser.add_argument('-p', '--protocol', help="if given, limits the dump to a particular subset of the data that corresponds to the given protocol", choices=db.protocol_names() if db.is_valid() else ())
    parser.add_argument('-u', '--purpose', help="if given, this value will limit the output files to those designed for the given purposes.", choices=db.purposes() if db.is_valid() else ())
    parser.add_argument('-g', '--group', help="if given, this value will limit the output files to those belonging to a particular protocolar group.", choices=db.groups() if db.is_valid() else ())
    parser.add_argument('-C', '--client', type=int, help="if given, this value will limit the output files to those belonging to the given client.", choices=db.model_ids() if db.is_valid() else ())
    parser.add_argument('-c', '--class', dest="sclass", help="if given, this value will limit the output files to those belonging to the given classes.", choices=('client', 'impostor'))
    parser.add_argument('--self-test', dest="selftest", action='store_true', help=argparse.SUPPRESS)
    parser.set_defaults(func=dumplist) #action

    # the "checkfiles" action
    parser = subparsers.add_parser('checkfiles', help=checkfiles.__doc__)
    parser.add_argument('-d', '--directory', help="if given, this path will be prepended to every entry returned.")
    parser.add_argument('-e', '--extension', help="if given, this extension will be appended to every entry returned.")
    parser.add_argument('--self-test', dest="selftest", action='store_true', help=argparse.SUPPRESS)
    parser.set_defaults(func=checkfiles) #action
160

161
    # adds the "reverse" command
162
163
164
165
    parser = subparsers.add_parser('reverse', help=reverse.__doc__)
    parser.add_argument('path', nargs='+', help="one or more path stems to look up. If you provide more than one, files which cannot be reversed will be omitted from the output.")
    parser.add_argument('--self-test', dest="selftest", action='store_true', help=argparse.SUPPRESS)
    parser.set_defaults(func=reverse) #action
166
167

    # adds the "path" command
168
169
170
171
172
173
174
    parser = subparsers.add_parser('path', help=path.__doc__)
    parser.add_argument('-d', '--directory', help="if given, this path will be prepended to every entry returned.")
    parser.add_argument('-e', '--extension', help="if given, this extension will be appended to every entry returned.")
    parser.add_argument('id', nargs='+', type=int, help="one or more file ids to look up. If you provide more than one, files which cannot be found will be omitted from the output. If you provide a single id to lookup, an error message will be printed if the id does not exist in the database. The exit status will be non-zero in such case.")
    parser.add_argument('--self-test', dest="selftest", action='store_true', help=argparse.SUPPRESS)
    parser.set_defaults(func=path) #action