1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 """
22 Adapt a database schema to another one.
23
24 Given a database in, say, PubMed format, it is possible to plug an
25 adapter on top of it so that it looks as if the database is in, say,
26 BibTeX format instead.
27 """
28
29 from gettext import gettext as _
30
31 from Pyblio.Store import Database
32 from Pyblio.Exceptions import AdaptError
33 from Pyblio import Registry
34
35
37
38 """ This class is a db built on top of another db, which behaves
39 as if it were of a different schema."""
40
41 header = None
42
44 self.base = base
45 return
46
48 return self.base.save()
49
51 raise RuntimeError(_("Adapter databases cannot be read from file"))
52
53
56 self.db = db
57 self.rs = rs
58
60 for k in self.rs.iterkeys():
61 yield self.db[k]
62
64 for k in self.rs.iterkeys():
65 yield k, self.db[k]
66
69
72
75
78 self.db = db
79 self.adapted = adapted
80
83
86
88 return iter(self.db.rs)
89
90 - def new(self, rsid=None):
92
94 return self.db.rs.update(result_set)
95
97 """ This adapter assumes a one-to-one mapping between the source
98 and the target databases. The keys are not modified. """
99
103
105 """ Translates a record from the source db to the target db """
106 raise NotImplemented('please override')
107
109 """ Translates a record from the target db to the source db """
110 raise NotImplemented('please override')
111
112 - def add(self, record):
114
117
120
123
131 def iteritems(s):
132 for k, v in e.iteritems():
133 yield k, self.source2target(v)
134 return
135 def iterkeys(s):
136 return e.iterkeys()
137 def __len__(s):
138 return len(e)
139 __iter__ = iterkeys
140 return Looper()
141
142 entries = property(_entries, None)
143
145 """ Returns a database using the specified 'target_schema', and
146 that maps the content of 'db', thanks to one or more
147 L{Adapter}s. If no suitable adapter can be found, will raise an
148 AdaptError()"""
149
150
151
152
153 if db.schema.id == target_schema:
154 return db
155
156
157 adapters = Registry.get(db.schema.id, 'adapters')
158
159 for adapter in adapters:
160 if adapter.target == target_schema:
161 return adapter()(db)
162
163 raise AdaptError(_("no adaptor for converting a %s into a %s") % (
164 db.schema.id, target_schema))
165