author | Julien Cristau <julien.cristau@logilab.fr> |
Mon, 16 Sep 2013 11:58:40 +0200 | |
changeset 9300 | 5f10cd13224d |
parent 9299 | c5eed908117d |
child 9360 | eda5071e30a1 |
permissions | -rw-r--r-- |
9299
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
1 |
sync_schema_props_perms('defaultval') |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
2 |
|
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
3 |
def convert_defaultval(cwattr, default): |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
4 |
from decimal import Decimal |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
5 |
import yams |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
6 |
from cubicweb import Binary |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
7 |
if default is None: |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
8 |
return |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
9 |
atype = cwattr.to_entity[0].name |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
10 |
if atype == 'Boolean': |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
11 |
assert default in ('True', 'False'), default |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
12 |
default = default == 'True' |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
13 |
elif atype in ('Int', 'BigInt'): |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
14 |
default = int(default) |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
15 |
elif atype == 'Float': |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
16 |
default = float(default) |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
17 |
elif atype == 'Decimal': |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
18 |
default = Decimal(default) |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
19 |
elif atype in ('Date', 'Datetime', 'TZDatetime', 'Time'): |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
20 |
try: |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
21 |
# handle NOW and TODAY, keep them stored as strings |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
22 |
yams.KEYWORD_MAP[atype][default.upper()] |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
23 |
default = default.upper() |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
24 |
except KeyError: |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
25 |
# otherwise get an actual date or datetime |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
26 |
default = yams.DATE_FACTORY_MAP[atype](default) |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
27 |
else: |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
28 |
assert atype == 'String', atype |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
29 |
default = unicode(default) |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
30 |
return Binary.zpickle(default) |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
31 |
|
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
32 |
dbh = repo.system_source.dbhelper |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
33 |
driver = config.sources()['system']['db-driver'] |
9300
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
34 |
|
9299
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
35 |
if driver == 'postgres' or driver.startswith('sqlserver'): |
9300
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
36 |
|
9299
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
37 |
sql('ALTER TABLE cw_cwattribute ADD new_defaultval %s' % dbh.TYPE_MAPPING['Bytes']) |
9300
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
38 |
|
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
39 |
for cwattr in rql('CWAttribute X').entities(): |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
40 |
olddefault = cwattr.defaultval |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
41 |
if olddefault is not None: |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
42 |
req = "UPDATE cw_cwattribute SET new_defaultval = %(val)s WHERE cw_eid = %(eid)s" |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
43 |
args = {'val': dbh.binary_value(convert_defaultval(cwattr, olddefault).getvalue()), 'eid': cwattr.eid} |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
44 |
sql(req, args, ask_confirm=False) |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
45 |
|
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
46 |
sql('ALTER TABLE cw_cwattribute DROP COLUMN cw_defaultval') |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
47 |
if config.sources()['system']['db-driver'] == 'postgres': |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
48 |
sql('ALTER TABLE cw_cwattribute RENAME COLUMN new_defaultval TO cw_defaultval') |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
49 |
else: |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
50 |
sql("sp_rename 'cw_cwattribute.new_defaultval', 'cw_defaultval', 'COLUMN'") |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
51 |
|
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
52 |
elif driver == 'sqlite': |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
53 |
|
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
54 |
import re |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
55 |
create = sql("SELECT sql FROM sqlite_master WHERE name = 'cw_CWAttribute'")[0][0] |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
56 |
create = re.sub('cw_defaultval varchar[^,]*,', 'cw_defaultval bytea,', create, re.I) |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
57 |
create = re.sub('cw_CWAttribute', 'tmp_cw_CWAttribute', create, re.I) |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
58 |
sql(create) |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
59 |
sql("INSERT INTO tmp_cw_CWAttribute SELECT * FROM cw_CWAttribute") |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
60 |
for cwattr in rql('CWAttribute X').entities(): |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
61 |
olddefault = cwattr.defaultval |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
62 |
if olddefault is None: |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
63 |
continue |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
64 |
req = "UPDATE tmp_cw_CWAttribute SET cw_defaultval = %(val)s WHERE cw_eid = %(eid)s" |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
65 |
args = {'val': dbh.binary_value(convert_defaultval(cwattr, olddefault).getvalue()), |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
66 |
'eid': cwattr.eid} |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
67 |
sql(req, args, ask_confirm=False) |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
68 |
|
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
69 |
sql('DROP TABLE cw_CWAttribute') |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
70 |
sql('ALTER TABLE tmp_cw_CWAttribute RENAME TO cw_CWAttribute') |
5f10cd13224d
defaultval migration for sqlite
Julien Cristau <julien.cristau@logilab.fr>
parents:
9299
diff
changeset
|
71 |
|
9299
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
72 |
else: |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
73 |
assert False, 'upgrade not supported on this database backend' |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
74 |
|
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
75 |
# Set object type to "Bytes" for CWAttribute's "defaultval" attribute |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
76 |
rql('SET X to_entity B WHERE X is CWAttribute, X from_entity Y, Y name "CWAttribute", ' |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
77 |
'X relation_type Z, Z name "defaultval", B name "Bytes"') |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
78 |
|
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
79 |
from yams import buildobjs as ybo |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
80 |
schema.add_relation_def(ybo.RelationDefinition('CWAttribute', 'defaultval', 'Bytes')) |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
81 |
schema.del_relation_def('CWAttribute', 'defaultval', 'String') |
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
82 |
|
c5eed908117d
[schema] store default attribute values in a Bytes field, allowing python objects as default values
Aurélien Campeas <aurelien.campeas@logilab.fr>
parents:
diff
changeset
|
83 |
commit() |