Skip to content

Commit 79dc2ed

Browse files
author
Richard Jones
committed
merge from HEAD
1 parent 6c3a152 commit 79dc2ed

File tree

4 files changed

+105
-41
lines changed

4 files changed

+105
-41
lines changed

CHANGES.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ Fixed:
88
- fixed grouping by a NULL Link value
99
- fixed anydbm import/export (sf bugs 965216, 964457, 964450)
1010
- fix python 2.3.3 strftime deprecation warning (sf patch 968398)
11+
- fix some column datatypes in postgresql and mysql (sf bugs 962611,
12+
959177 and 964231)
13+
- fixed RDBMS journal packing (sf bug 959177)
1114

1215

1316
2004-05-28 0.7.3

roundup/backends/back_mysql.py

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,13 @@ def add_new_columns_v2(self):
337337
# change things
338338
self.database_schema['tables'][cn] = klass.schema()
339339

340+
def fix_version_2_tables(self):
341+
# Convert journal date column to TIMESTAMP, params column to TEXT
342+
self._convert_journal_tables()
343+
344+
# Convert all String properties to TEXT
345+
self._convert_string_properties()
346+
340347
def __repr__(self):
341348
return '<myroundsql 0x%x>'%id(self)
342349

@@ -353,11 +360,7 @@ def sql_index_exists(self, table_name, index_name):
353360
return 1
354361
return 0
355362

356-
def save_dbschema(self, schema):
357-
s = repr(self.database_schema)
358-
self.sql('INSERT INTO schema VALUES (%s)', (s,))
359-
360-
def create_class_table(self, spec):
363+
def create_class_table(self, spec, create_sequence=True):
361364
cols, mls = self.determine_columns(spec.properties.items())
362365

363366
# add on our special columns
@@ -391,11 +394,14 @@ def drop_class_table_indexes(self, cn, key):
391394
self.cursor.execute(index_sql)
392395

393396
def create_journal_table(self, spec):
397+
''' create the journal table for a class given the spec and
398+
already-determined cols
399+
'''
394400
# journal table
395401
cols = ','.join(['%s varchar'%x
396402
for x in 'nodeid date tag action params'.split()])
397403
sql = '''create table %s__journal (
398-
nodeid integer, date timestamp, tag varchar(255),
404+
nodeid integer, date datetime, tag varchar(255),
399405
action varchar(255), params text) type=%s'''%(
400406
spec.classname, self.mysql_backend)
401407
if __debug__:

roundup/backends/back_postgresql.py

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -122,12 +122,12 @@ def open_connection(self):
122122
def create_version_2_tables(self):
123123
# OTK store
124124
self.cursor.execute('''CREATE TABLE otks (otk_key VARCHAR(255),
125-
otk_value VARCHAR(255), otk_time FLOAT(20))''')
125+
otk_value VARCHAR(255), otk_time REAL)''')
126126
self.cursor.execute('CREATE INDEX otks_key_idx ON otks(otk_key)')
127127

128128
# Sessions store
129129
self.cursor.execute('''CREATE TABLE sessions (
130-
session_key VARCHAR(255), session_time FLOAT(20),
130+
session_key VARCHAR(255), session_time REAL,
131131
session_value VARCHAR(255))''')
132132
self.cursor.execute('''CREATE INDEX sessions_key_idx ON
133133
sessions(session_key)''')
@@ -141,6 +141,24 @@ def create_version_2_tables(self):
141141
_textid integer)''')
142142
self.cursor.execute('CREATE INDEX words_word_idx ON __words(_word)')
143143

144+
def fix_version_2_tables(self):
145+
# Convert journal date column to TIMESTAMP, params column to TEXT
146+
self._convert_journal_tables()
147+
148+
# Convert all String properties to TEXT
149+
self._convert_string_properties()
150+
151+
# convert session / OTK *_time columns to REAL
152+
c = self.cursor
153+
for name in ('otk', 'session'):
154+
c.execute('drop index %ss_key_idx'%name)
155+
c.execute('drop table %ss'%name)
156+
c.execute('''CREATE TABLE %ss (%s_key VARCHAR(255),
157+
%s_value VARCHAR(255), %s_time REAL)'''%(name, name, name,
158+
name))
159+
c.execute('CREATE INDEX %ss_key_idx ON %ss(%s_key)'%(name, name,
160+
name))
161+
144162
def add_actor_column(self):
145163
# update existing tables to have the new actor column
146164
tables = self.database_schema['tables']
@@ -162,11 +180,12 @@ def sql_index_exists(self, table_name, index_name):
162180
self.cursor.execute(sql, (table_name, index_name))
163181
return self.cursor.fetchone()[0]
164182

165-
def create_class_table(self, spec):
166-
sql = 'CREATE SEQUENCE _%s_ids'%spec.classname
167-
if __debug__:
168-
print >>hyperdb.DEBUG, 'create_class_table', (self, sql)
169-
self.cursor.execute(sql)
183+
def create_class_table(self, spec, create_sequence=True):
184+
if create_sequence:
185+
sql = 'CREATE SEQUENCE _%s_ids'%spec.classname
186+
if __debug__:
187+
print >>hyperdb.DEBUG, 'create_class_table', (self, sql)
188+
self.cursor.execute(sql)
170189

171190
return rdbms_common.Database.create_class_table(self, spec)
172191

@@ -181,25 +200,6 @@ def drop_class_table(self, cn):
181200
print >>hyperdb.DEBUG, 'drop_class', (self, sql)
182201
self.cursor.execute(sql)
183202

184-
def create_journal_table(self, spec):
185-
cols = ',' . join(['"%s" VARCHAR(255)'%x
186-
for x in 'nodeid date tag action params' . split()])
187-
sql = 'CREATE TABLE "%s__journal" (%s)'%(spec.classname, cols)
188-
if __debug__:
189-
print >>hyperdb.DEBUG, 'create_journal_table', (self, sql)
190-
self.cursor.execute(sql)
191-
self.create_journal_table_indexes(spec)
192-
193-
def create_multilink_table(self, spec, ml):
194-
sql = '''CREATE TABLE "%s_%s" (linkid VARCHAR(255),
195-
nodeid VARCHAR(255))'''%(spec.classname, ml)
196-
197-
if __debug__:
198-
print >>hyperdb.DEBUG, 'create_class', (self, sql)
199-
200-
self.cursor.execute(sql)
201-
self.create_multilink_table_indexes(spec, ml)
202-
203203
def newid(self, classname):
204204
sql = "select nextval('_%s_ids') from dual"%classname
205205
if __debug__:

roundup/backends/rdbms_common.py

Lines changed: 64 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# $Id: rdbms_common.py,v 1.98.2.5 2004-05-29 02:09:13 richard Exp $
1+
# $Id: rdbms_common.py,v 1.98.2.6 2004-06-09 06:16:56 richard Exp $
22
''' Relational database (SQL) backend common code.
33
44
Basics:
@@ -143,10 +143,11 @@ def load_dbschema(self):
143143
else:
144144
self.database_schema = {}
145145

146-
def save_dbschema(self, schema):
146+
def save_dbschema(self):
147147
''' Save the schema definition that the database currently implements
148148
'''
149149
s = repr(self.database_schema)
150+
self.sql('delete from schema')
150151
self.sql('insert into schema values (%s)', (s,))
151152

152153
def post_init(self):
@@ -178,8 +179,7 @@ def post_init(self):
178179

179180
# update the database version of the schema
180181
if save:
181-
self.sql('delete from schema')
182-
self.save_dbschema(self.database_schema)
182+
self.save_dbschema()
183183

184184
# reindex the db if necessary
185185
if self.indexer.should_reindex():
@@ -190,7 +190,7 @@ def post_init(self):
190190

191191
# update this number when we need to make changes to the SQL structure
192192
# of the backen database
193-
current_db_version = 2
193+
current_db_version = 3
194194
def upgrade_db(self):
195195
''' Update the SQL database to reflect changes in the backend code.
196196
@@ -213,9 +213,65 @@ def upgrade_db(self):
213213
# database
214214
self.create_version_2_tables()
215215

216+
if version == 2:
217+
self.fix_version_2_tables()
218+
216219
self.database_schema['version'] = self.current_db_version
217220
return 1
218221

222+
def fix_version_2_tables(self):
223+
'''Default (used by sqlite): NOOP'''
224+
pass
225+
226+
def _convert_journal_tables(self):
227+
'''Get current journal table contents, drop the table and re-create'''
228+
c = self.cursor
229+
cols = ','.join('nodeid date tag action params'.split())
230+
for klass in self.classes.values():
231+
# slurp and drop
232+
sql = 'select %s from %s__journal order by date'%(cols,
233+
klass.classname)
234+
c.execute(sql)
235+
contents = c.fetchall()
236+
self.drop_journal_table_indexes(klass.classname)
237+
c.execute('drop table %s__journal'%klass.classname)
238+
239+
# re-create and re-populate
240+
self.create_journal_table(klass)
241+
a = self.arg
242+
sql = 'insert into %s__journal (%s) values (%s,%s,%s,%s,%s)'%(
243+
klass.classname, cols, a, a, a, a, a)
244+
for row in contents:
245+
# no data conversion needed
246+
self.cursor.execute(sql, row)
247+
248+
def _convert_string_properties(self):
249+
'''Get current Class tables that contain String properties, and
250+
convert the VARCHAR columns to TEXT'''
251+
c = self.cursor
252+
for klass in self.classes.values():
253+
# slurp and drop
254+
cols, mls = self.determine_columns(klass.properties.items())
255+
scols = ','.join([i[0] for i in cols])
256+
sql = 'select id,%s from _%s'%(scols, klass.classname)
257+
c.execute(sql)
258+
contents = c.fetchall()
259+
self.drop_class_table_indexes(klass.classname, klass.getkey())
260+
c.execute('drop table _%s'%klass.classname)
261+
262+
# re-create and re-populate
263+
self.create_class_table(klass, create_sequence=False)
264+
a = ','.join([self.arg for i in range(len(cols)+1)])
265+
sql = 'insert into _%s (id,%s) values (%s)'%(klass.classname,
266+
scols, a)
267+
for row in contents:
268+
l = []
269+
for entry in row:
270+
# mysql will already be a string - psql needs "help"
271+
if entry is not None and not isinstance(entry, type('')):
272+
entry = str(entry)
273+
l.append(entry)
274+
self.cursor.execute(sql, l)
219275

220276
def refresh_database(self):
221277
self.post_init()
@@ -227,7 +283,7 @@ def reindex(self):
227283
self.indexer.save_index()
228284

229285
hyperdb_to_sql_datatypes = {
230-
hyperdb.String : 'VARCHAR(255)',
286+
hyperdb.String : 'TEXT',
231287
hyperdb.Date : 'TIMESTAMP',
232288
hyperdb.Link : 'INTEGER',
233289
hyperdb.Interval : 'VARCHAR(255)',
@@ -466,7 +522,7 @@ def create_multilink_table(self, spec, ml):
466522
given by the spec
467523
'''
468524
# create the table
469-
sql = 'create table %s_%s (linkid varchar, nodeid varchar)'%(
525+
sql = 'create table %s_%s (linkid varchar(255), nodeid varchar(255))'%(
470526
spec.classname, ml)
471527
if __debug__:
472528
print >>hyperdb.DEBUG, 'create_class', (self, sql)
@@ -1092,8 +1148,7 @@ def load_journal(self, classname, cols, nodeid):
10921148
def pack(self, pack_before):
10931149
''' Delete all journal entries except "create" before 'pack_before'.
10941150
'''
1095-
# get a 'yyyymmddhhmmss' version of the date
1096-
date_stamp = pack_before.serialise()
1151+
date_stamp = self.hyperdb_to_sql_value[Date](pack_before)
10971152

10981153
# do the delete
10991154
for classname in self.classes.keys():

0 commit comments

Comments
 (0)