From e09455ccd8ef2af53ce8eaf17b2cde305a8fd1c0 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Tue, 9 Dec 2008 14:35:40 +0100 Subject: [PATCH] [FIX] psycopg2: %d -> %s [IMP] orm: use _symbol_f when updating database at initialization [IMP] misc.ustr: function returning the unicode string representation of a object bzr revid: christophe@tinyerp.com-20081209133540-zlb6wxs97cxa99nx --- bin/osv/fields.py | 59 ++++++++-------- bin/osv/orm.py | 165 ++++++++++++++++++++++--------------------- bin/tools/convert.py | 12 ++-- bin/tools/misc.py | 30 ++++++-- 4 files changed, 145 insertions(+), 121 deletions(-) diff --git a/bin/osv/fields.py b/bin/osv/fields.py index 097697cb3e1..617399478f1 100644 --- a/bin/osv/fields.py +++ b/bin/osv/fields.py @@ -86,7 +86,7 @@ class _column(object): pass def set(self, cr, obj, id, name, value, user=None, context=None): - cr.execute('update '+obj._table+' set '+name+'='+self._symbol_set[0]+' where id=%d', (self._symbol_set[1](value), id)) + cr.execute('update '+obj._table+' set '+name+'='+self._symbol_set[0]+' where id=%s', (self._symbol_set[1](value), id)) def set_memory(self, cr, obj, id, name, value, user=None, context=None): raise Exception(_('Not implemented set_memory method !')) @@ -118,13 +118,13 @@ class boolean(_column): class integer_big(_column): _type = 'integer_big' - _symbol_c = '%d' + _symbol_c = '%s' _symbol_f = lambda x: int(x or 0) _symbol_set = (_symbol_c, _symbol_f) class integer(_column): _type = 'integer' - _symbol_c = '%d' + _symbol_c = '%s' _symbol_f = lambda x: int(x or 0) _symbol_set = (_symbol_c, _symbol_f) @@ -168,10 +168,9 @@ class text(_column): import __builtin__ - class float(_column): _type = 'float' - _symbol_c = '%f' + _symbol_c = '%s' _symbol_f = lambda x: __builtin__.float(x or 0.0) _symbol_set = (_symbol_c, _symbol_f) @@ -263,9 +262,9 @@ class one2one(_column): self._table = obj_src.pool.get(self._obj)._table if act[0] == 0: id_new = obj.create(cr, user, act[1]) - cr.execute('update '+obj_src._table+' set '+field+'=%d where id=%d', (id_new, id)) + cr.execute('update '+obj_src._table+' set '+field+'=%s where id=%s', (id_new, id)) else: - cr.execute('select '+field+' from '+obj_src._table+' where id=%d', (act[0],)) + cr.execute('select '+field+' from '+obj_src._table+' where id=%s', (act[0],)) id = cr.fetchone()[0] obj.write(cr, user, [id], act[1], context=context) @@ -331,20 +330,20 @@ class many2one(_column): for act in values: if act[0] == 0: id_new = obj.create(cr, act[2]) - cr.execute('update '+obj_src._table+' set '+field+'=%d where id=%d', (id_new, id)) + cr.execute('update '+obj_src._table+' set '+field+'=%s where id=%s', (id_new, id)) elif act[0] == 1: obj.write(cr, [act[1]], act[2], context=context) elif act[0] == 2: - cr.execute('delete from '+self._table+' where id=%d', (act[1],)) + cr.execute('delete from '+self._table+' where id=%s', (act[1],)) elif act[0] == 3 or act[0] == 5: - cr.execute('update '+obj_src._table+' set '+field+'=null where id=%d', (id,)) + cr.execute('update '+obj_src._table+' set '+field+'=null where id=%s', (id,)) elif act[0] == 4: - cr.execute('update '+obj_src._table+' set '+field+'=%d where id=%d', (act[1], id)) + cr.execute('update '+obj_src._table+' set '+field+'=%s where id=%s', (act[1], id)) else: if values: - cr.execute('update '+obj_src._table+' set '+field+'=%d where id=%d', (values, id)) + cr.execute('update '+obj_src._table+' set '+field+'=%s where id=%s', (values, id)) else: - cr.execute('update '+obj_src._table+' set '+field+'=null where id=%d', (id,)) + cr.execute('update '+obj_src._table+' set '+field+'=null where id=%s', (id,)) def search(self, cr, obj, args, name, value, offset=0, limit=None, uid=None): return obj.pool.get(self._obj).search(cr, uid, args+self._domain+[('name', 'like', value)], offset, limit) @@ -435,19 +434,19 @@ class one2many(_column): elif act[0] == 2: obj.unlink(cr, user, [act[1]], context=context) elif act[0] == 3: - cr.execute('update '+_table+' set '+self._fields_id+'=null where id=%d', (act[1],)) + cr.execute('update '+_table+' set '+self._fields_id+'=null where id=%s', (act[1],)) elif act[0] == 4: - cr.execute('update '+_table+' set '+self._fields_id+'=%d where id=%d', (id, act[1])) + cr.execute('update '+_table+' set '+self._fields_id+'=%s where id=%s', (id, act[1])) elif act[0] == 5: - cr.execute('update '+_table+' set '+self._fields_id+'=null where '+self._fields_id+'=%d', (id,)) + cr.execute('update '+_table+' set '+self._fields_id+'=null where '+self._fields_id+'=%s', (id,)) elif act[0] == 6: if not act[2]: ids2 = [0] else: ids2 = act[2] - cr.execute('update '+_table+' set '+self._fields_id+'=NULL where '+self._fields_id+'=%d and id not in ('+','.join(map(str, ids2))+')', (id,)) + cr.execute('update '+_table+' set '+self._fields_id+'=NULL where '+self._fields_id+'=%s and id not in ('+','.join(map(str, ids2))+')', (id,)) if act[2]: - cr.execute('update '+_table+' set '+self._fields_id+'=%d where id in ('+','.join(map(str, act[2]))+')', (id,)) + cr.execute('update '+_table+' set '+self._fields_id+'=%s where id in ('+','.join(map(str, act[2]))+')', (id,)) def search(self, cr, obj, args, name, value, offset=0, limit=None, uid=None, operator='like'): return obj.pool.get(self._obj).name_search(cr, uid, value, self._domain, offset, limit) @@ -500,7 +499,7 @@ class many2many(_column): FROM '+self._rel+' , '+obj._table+' \ WHERE '+self._rel+'.'+self._id1+' in ('+ids_s+') \ AND '+self._rel+'.'+self._id2+' = '+obj._table+'.id '+d1 - +limit_str+' order by '+obj._table+'.'+obj._order+' offset %d', + +limit_str+' order by '+obj._table+'.'+obj._order+' offset %s', d2+[offset]) for r in cr.fetchall(): res[r[1]].append(r[0]) @@ -515,26 +514,26 @@ class many2many(_column): for act in values: if act[0] == 0: idnew = obj.create(cr, user, act[2]) - cr.execute('insert into '+self._rel+' ('+self._id1+','+self._id2+') values (%d,%d)', (id, idnew)) + cr.execute('insert into '+self._rel+' ('+self._id1+','+self._id2+') values (%s,%s)', (id, idnew)) elif act[0] == 1: obj.write(cr, user, [act[1]], act[2], context=context) elif act[0] == 2: obj.unlink(cr, user, [act[1]], context=context) elif act[0] == 3: - cr.execute('delete from '+self._rel+' where ' + self._id1 + '=%d and '+ self._id2 + '=%d', (id, act[1])) + cr.execute('delete from '+self._rel+' where ' + self._id1 + '=%s and '+ self._id2 + '=%s', (id, act[1])) elif act[0] == 4: - cr.execute('insert into '+self._rel+' ('+self._id1+','+self._id2+') values (%d,%d)', (id, act[1])) + cr.execute('insert into '+self._rel+' ('+self._id1+','+self._id2+') values (%s,%s)', (id, act[1])) elif act[0] == 5: - cr.execute('update '+self._rel+' set '+self._id2+'=null where '+self._id2+'=%d', (id,)) + cr.execute('update '+self._rel+' set '+self._id2+'=null where '+self._id2+'=%s', (id,)) elif act[0] == 6: d1, d2 = obj.pool.get('ir.rule').domain_get(cr, user, obj._name) if d1: d1 = ' and ' + d1 - cr.execute('delete from '+self._rel+' where '+self._id1+'=%d AND '+self._id2+' IN (SELECT '+self._rel+'.'+self._id2+' FROM '+self._rel+', '+obj._table+' WHERE '+self._rel+'.'+self._id1+'=%d AND '+self._rel+'.'+self._id2+' = '+obj._table+'.id '+ d1 +')', [id, id]+d2) + cr.execute('delete from '+self._rel+' where '+self._id1+'=%s AND '+self._id2+' IN (SELECT '+self._rel+'.'+self._id2+' FROM '+self._rel+', '+obj._table+' WHERE '+self._rel+'.'+self._id1+'=%s AND '+self._rel+'.'+self._id2+' = '+obj._table+'.id '+ d1 +')', [id, id]+d2) for act_nbr in act[2]: - cr.execute('insert into '+self._rel+' ('+self._id1+','+self._id2+') values (%d, %d)', (id, act_nbr)) + cr.execute('insert into '+self._rel+' ('+self._id1+','+self._id2+') values (%s, %s)', (id, act_nbr)) # # TODO: use a name_search @@ -601,9 +600,9 @@ class function(_column): self._classic_read = True self._classic_write = True if type == 'float': - self._symbol_c = '%f' - self._symbol_f = lambda x: __builtin__.float(x or 0.0) - self._symbol_set = (self._symbol_c, self._symbol_f) + self._symbol_c = float._symbol_c + self._symbol_f = float._symbol_f + self._symbol_set = float._symbol_set def search(self, cr, uid, obj, name, args): if not self._fnct_search: @@ -680,7 +679,7 @@ class related(function): if field_detail[1] in ('date'): where += " %s.%s %s '%s' and" % (obj_child._table, self._arg[i], context[0][1], context[0][2]) if field_detail[1] in ['integer', 'long', 'float','integer_big']: - where += " %s.%s %s '%d' and" % (obj_child._table, self._arg[i], context[0][1], context[0][2]) + where += " %s.%s %s '%s' and" % (obj_child._table, self._arg[i], context[0][1], context[0][2]) if len(where)>10: query += where.rstrip('and') cr.execute(query) @@ -754,7 +753,7 @@ class property(function): nid = property.search(cr, uid, [('fields_id', '=', definition_id), ('res_id', '=', obj._name+','+str(id))]) while len(nid): - cr.execute('DELETE FROM ir_property WHERE id=%d', (nid.pop(),)) + cr.execute('DELETE FROM ir_property WHERE id=%s', (nid.pop(),)) nid = property.search(cr, uid, [('fields_id', '=', definition_id), ('res_id', '=', False)]) diff --git a/bin/osv/orm.py b/bin/osv/orm.py index c9c813da720..5a2c8aaf34b 100644 --- a/bin/osv/orm.py +++ b/bin/osv/orm.py @@ -342,7 +342,7 @@ class orm_template(object): id, model_id, model, name, field_description, ttype, relation,view_load,state,select_level ) VALUES ( - %d,%s,%s,%s,%s,%s,%s,%s,%s,%s + %s,%s,%s,%s,%s,%s,%s,%s,%s,%s )""", ( id, vals['model_id'], vals['model'], vals['name'], vals['field_description'], vals['ttype'], vals['relation'], bool(vals['view_load']), 'base', @@ -995,7 +995,7 @@ class orm_template(object): while ok: if view_id: where = (model and (" and model='%s'" % (self._name,))) or '' - cr.execute('SELECT arch,name,field_parent,id,type,inherit_id FROM ir_ui_view WHERE id=%d'+where, (view_id,)) + cr.execute('SELECT arch,name,field_parent,id,type,inherit_id FROM ir_ui_view WHERE id=%s'+where, (view_id,)) else: cr.execute('''SELECT arch,name,field_parent,id,type,inherit_id @@ -1021,7 +1021,7 @@ class orm_template(object): def _inherit_apply_rec(result, inherit_id): # get all views which inherit from (ie modify) this view - cr.execute('select arch,id from ir_ui_view where inherit_id=%d and model=%s order by priority', (inherit_id, self._name)) + cr.execute('select arch,id from ir_ui_view where inherit_id=%s and model=%s order by priority', (inherit_id, self._name)) sql_inherit = cr.fetchall() for (inherit, id) in sql_inherit: result = _inherit_apply(result, inherit) @@ -1368,7 +1368,7 @@ class orm(orm_template): childs = cr.fetchall() for id in childs: pos2 = browse_rec(id[0], pos2) - cr.execute('update '+self._table+' set parent_left=%d, parent_right=%d where id=%d', (pos,pos2,root)) + cr.execute('update '+self._table+' set parent_left=%s, parent_right=%s where id=%s', (pos,pos2,root)) return pos2+1 browse_rec(None) return True @@ -1396,8 +1396,8 @@ class orm(orm_template): logger.notifyChannel('init', netsvc.LOG_ERROR, 'create a column parent_right on object %s: fields.integer(\'Right Parent\', select=1)' % (self._table, )) if self._columns[self._parent_name].ondelete<>'cascade': logger.notifyChannel('init', netsvc.LOG_ERROR, "the columns %s on object must be set as ondelete='cascasde'" % (self._name, self._parent_name)) - cr.execute("ALTER TABLE \"%s\" ADD COLUMN \"%s\" INTEGER" % (self._table, 'parent_left')) - cr.execute("ALTER TABLE \"%s\" ADD COLUMN \"%s\" INTEGER" % (self._table, 'parent_right')) + cr.execute('ALTER TABLE "%s" ADD COLUMN "parent_left" INTEGER' % (self._table,)) + cr.execute('ALTER TABLE "%s" ADD COLUMN "parent_right" INTEGER' % (self._table,)) cr.commit() store_compute = True @@ -1409,15 +1409,13 @@ class orm(orm_template): 'write_date': 'TIMESTAMP' } for k in logs: - cr.execute( - """ + cr.execute(""" SELECT c.relname - FROM pg_class c, pg_attribute a - WHERE c.relname='%s' AND a.attname='%s' AND c.oid=a.attrelid - """ % (self._table, k)) + FROM pg_class c, pg_attribute a + WHERE c.relname=%s AND a.attname=%s AND c.oid=a.attrelid + """, (self._table, k)) if not cr.rowcount: - cr.execute("ALTER TABLE \"%s\" ADD COLUMN \"%s\" %s" % - (self._table, k, logs[k])) + cr.execute('ALTER TABLE "%s" ADD COLUMN "%s" %s' % (self._table, k, logs[k])) cr.commit() # iterate on the database columns to drop the NOT NULL constraints @@ -1425,12 +1423,12 @@ class orm(orm_template): cr.execute( "SELECT a.attname, a.attnotnull "\ "FROM pg_class c, pg_attribute a "\ - "WHERE c.oid=a.attrelid AND c.relname='%s'" % self._table) + "WHERE c.oid=a.attrelid AND c.relname=%s", (self._table,)) db_columns = cr.dictfetchall() for column in db_columns: if column['attname'] not in ('id', 'oid', 'tableoid', 'ctid', 'xmin', 'xmax', 'cmin', 'cmax'): if column['attnotnull'] and column['attname'] not in self._columns: - cr.execute("ALTER TABLE \"%s\" ALTER COLUMN \"%s\" DROP NOT NULL" % (self._table, column['attname'])) + cr.execute('ALTER TABLE "%s" ALTER COLUMN "%s" DROP NOT NULL' % (self._table, column['attname'])) # iterate on the "object columns" todo_update_store = [] @@ -1443,10 +1441,10 @@ class orm(orm_template): if isinstance(f, fields.one2many): cr.execute("SELECT relname FROM pg_class WHERE relkind='r' AND relname=%s", (f._obj,)) if cr.fetchone(): - cr.execute("SELECT count(*) as c FROM pg_class c,pg_attribute a WHERE c.relname=%s AND a.attname=%s AND c.oid=a.attrelid", (f._obj, f._fields_id)) + cr.execute("SELECT count(1) as c FROM pg_class c,pg_attribute a WHERE c.relname=%s AND a.attname=%s AND c.oid=a.attrelid", (f._obj, f._fields_id)) res = cr.fetchone()[0] if not res: - cr.execute("ALTER TABLE \"%s\" ADD FOREIGN KEY (%s) REFERENCES \"%s\" ON DELETE SET NULL" % (self._obj, f._fields_id, f._table)) + cr.execute('ALTER TABLE "%s" ADD FOREIGN KEY (%s) REFERENCES "%s" ON DELETE SET NULL' % (self._obj, f._fields_id, f._table)) elif isinstance(f, fields.many2many): cr.execute("SELECT relname FROM pg_class WHERE relkind in ('r','v') AND relname=%s", (f._rel,)) if not cr.dictfetchall(): @@ -1455,9 +1453,9 @@ class orm(orm_template): ref = self.pool.get(f._obj)._table except AttributeError: ref = f._obj.replace('.', '_') - cr.execute("CREATE TABLE \"%s\" (\"%s\" INTEGER NOT NULL REFERENCES \"%s\" ON DELETE CASCADE, \"%s\" INTEGER NOT NULL REFERENCES \"%s\" ON DELETE CASCADE) WITH OIDS"%(f._rel, f._id1, self._table, f._id2, ref)) - cr.execute("CREATE INDEX \"%s_%s_index\" ON \"%s\" (\"%s\")" % (f._rel, f._id1, f._rel, f._id1)) - cr.execute("CREATE INDEX \"%s_%s_index\" ON \"%s\" (\"%s\")" % (f._rel, f._id2, f._rel, f._id2)) + cr.execute('CREATE TABLE "%s" ("%s" INTEGER NOT NULL REFERENCES "%s" ON DELETE CASCADE, "%s" INTEGER NOT NULL REFERENCES "%s" ON DELETE CASCADE) WITH OIDS' % (f._rel, f._id1, self._table, f._id2, ref)) + cr.execute('CREATE INDEX "%s_%s_index" ON "%s" ("%s")' % (f._rel, f._id1, f._rel, f._id1)) + cr.execute('CREATE INDEX "%s_%s_index" ON "%s" ("%s")' % (f._rel, f._id2, f._rel, f._id2)) cr.commit() else: cr.execute("SELECT c.relname,a.attname,a.attlen,a.atttypmod,a.attnotnull,a.atthasdef,t.typname,CASE WHEN a.attlen=-1 THEN a.atttypmod-4 ELSE a.attlen END as size FROM pg_class c,pg_attribute a,pg_type t WHERE c.relname=%s AND a.attname=%s AND c.oid=a.attrelid AND a.atttypid=t.oid", (self._table, k)) @@ -1466,15 +1464,14 @@ class orm(orm_template): if not isinstance(f, fields.function) or f.store: # add the missing field - cr.execute("ALTER TABLE \"%s\" ADD COLUMN \"%s\" %s" % (self._table, k, get_pg_type(f)[1])) + cr.execute('ALTER TABLE "%s" ADD COLUMN "%s" %s' % (self._table, k, get_pg_type(f)[1])) # initialize it if not create and k in self._defaults: default = self._defaults[k](self, cr, 1, {}) - if not default: - cr.execute("UPDATE \"%s\" SET \"%s\"=NULL" % (self._table, k)) - else: - cr.execute("UPDATE \"%s\" SET \"%s\"='%s'" % (self._table, k, default)) + ss = self._columns[k]._symbol_set + query = 'UPDATE "%s" SET "%s"=%s' % (self._table, k, ss[0]) + cr.execute(query, (default is not None and ss[1](default) or None,)) if isinstance(f, fields.function): todo_update_store.append((f,k)) @@ -1488,13 +1485,13 @@ class orm(orm_template): ref = f._obj.replace('.', '_') # ir_actions is inherited so foreign key doesn't work on it if ref != 'ir_actions': - cr.execute("ALTER TABLE \"%s\" ADD FOREIGN KEY (\"%s\") REFERENCES \"%s\" ON DELETE %s" % (self._table, k, ref, f.ondelete)) + cr.execute('ALTER TABLE "%s" ADD FOREIGN KEY ("%s") REFERENCES "%s" ON DELETE %s' % (self._table, k, ref, f.ondelete)) if f.select: - cr.execute("CREATE INDEX \"%s_%s_index\" ON \"%s\" (\"%s\")" % (self._table, k, self._table, k)) + cr.execute('CREATE INDEX "%s_%s_index" ON "%s" ("%s")' % (self._table, k, self._table, k)) if f.required: cr.commit() try: - cr.execute("ALTER TABLE \"%s\" ALTER COLUMN \"%s\" SET NOT NULL" % (self._table, k)) + cr.execute('ALTER TABLE "%s" ALTER COLUMN "%s" SET NOT NULL' % (self._table, k)) except: logger.notifyChannel('init', netsvc.LOG_WARNING, 'WARNING: unable to set column %s of table %s not null !\nTry to re-run: openerp-server.py --update=module\nIf it doesn\'t work, update records and execute manually:\nALTER TABLE %s ALTER COLUMN %s SET NOT NULL' % (k, self._table, self._table, k)) cr.commit() @@ -1521,61 +1518,64 @@ class orm(orm_template): # We update varchar size, otherwise, we keep DB size # to avoid truncated string... if f_pg_size < f.size: - cr.execute("ALTER TABLE \"%s\" RENAME COLUMN \"%s\" TO temp_change_size" % (self._table, k)) - cr.execute("ALTER TABLE \"%s\" ADD COLUMN \"%s\" VARCHAR(%d)" % (self._table, k, f.size)) - cr.execute("UPDATE \"%s\" SET \"%s\"=temp_change_size::VARCHAR(%d)" % (self._table, k, f.size)) - cr.execute("ALTER TABLE \"%s\" DROP COLUMN temp_change_size" % (self._table,)) + cr.execute('ALTER TABLE "%s" RENAME COLUMN "%s" TO temp_change_size' % (self._table, k)) + cr.execute('ALTER TABLE "%s" ADD COLUMN "%s" VARCHAR(%d)' % (self._table, k, f.size)) + cr.execute('UPDATE "%s" SET "%s"=temp_change_size::VARCHAR(%d)' % (self._table, k, f.size)) + cr.execute('ALTER TABLE "%s" DROP COLUMN temp_change_size' % (self._table,)) cr.commit() if f_pg_type == 'date' and f._type == 'datetime': - cr.execute("ALTER TABLE \"%s\" RENAME COLUMN \"%s\" TO temp_change_type" % (self._table, k)) - cr.execute("ALTER TABLE \"%s\" ADD COLUMN \"%s\" TIMESTAMP " % (self._table, k)) - cr.execute("UPDATE \"%s\" SET \"%s\"=temp_change_type::TIMESTAMP" % (self._table, k)) - cr.execute("ALTER TABLE \"%s\" DROP COLUMN temp_change_type" % (self._table,)) + cr.execute('ALTER TABLE "%s" RENAME COLUMN "%s" TO temp_change_type' % (self._table, k)) + cr.execute('ALTER TABLE "%s" ADD COLUMN "%s" TIMESTAMP' % (self._table, k)) + cr.execute('UPDATE "%s" SET "%s"=temp_change_type::TIMESTAMP' % (self._table, k)) + cr.execute('ALTER TABLE "%s" DROP COLUMN temp_change_type' % (self._table,)) cr.commit() # if the field is required and hasn't got a NOT NULL constraint if f.required and f_pg_notnull == 0: # set the field to the default value if any if k in self._defaults: default = self._defaults[k](self, cr, 1, {}) - if not (default is False): - cr.execute("UPDATE \"%s\" SET \"%s\"='%s' WHERE %s is NULL" % (self._table, k, default, k)) + if (default is not None): + ss = self._columns[k]._symbol_set + query = 'UPDATE "%s" SET "%s"=%s WHERE %s is NULL' % (self._table, k, ss[0], k) + cr.execute(query, (ss[1](default),)) cr.commit() # add the NOT NULL constraint try: - cr.execute("ALTER TABLE \"%s\" ALTER COLUMN \"%s\" SET NOT NULL" % (self._table, k)) + cr.execute('ALTER TABLE "%s" ALTER COLUMN "%s" SET NOT NULL' % (self._table, k)) cr.commit() except: logger.notifyChannel('init', netsvc.LOG_WARNING, 'unable to set a NOT NULL constraint on column %s of the %s table !\nIf you want to have it, you should update the records and execute manually:\nALTER TABLE %s ALTER COLUMN %s SET NOT NULL' % (k, self._table, self._table, k)) cr.commit() elif not f.required and f_pg_notnull == 1: - cr.execute("ALTER TABLE \"%s\" ALTER COLUMN \"%s\" DROP NOT NULL" % (self._table, k)) + cr.execute('ALTER TABLE "%s" ALTER COLUMN "%s" DROP NOT NULL' % (self._table, k)) cr.commit() - cr.execute("SELECT indexname FROM pg_indexes WHERE indexname = '%s_%s_index' and tablename = '%s'" % (self._table, k, self._table)) + indexname = '%s_%s_index' % (self._table, k) + cr.execute("SELECT indexname FROM pg_indexes WHERE indexname = %s and tablename = %s", (indexname, self._table)) res = cr.dictfetchall() if not res and f.select: - cr.execute("CREATE INDEX \"%s_%s_index\" ON \"%s\" (\"%s\")" % (self._table, k, self._table, k)) + cr.execute('CREATE INDEX "%s_%s_index" ON "%s" ("%s")' % (self._table, k, self._table, k)) cr.commit() if res and not f.select: - cr.execute("DROP INDEX \"%s_%s_index\"" % (self._table, k)) + cr.execute('DROP INDEX "%s_%s_index"' % (self._table, k)) cr.commit() if isinstance(f, fields.many2one): ref = self.pool.get(f._obj)._table if ref != 'ir_actions': - cr.execute('SELECT confdeltype, conname FROM pg_constraint as con, pg_class as cl1, pg_class as cl2, ' \ - 'pg_attribute as att1, pg_attribute as att2 ' \ - 'WHERE con.conrelid = cl1.oid ' \ - 'AND cl1.relname = %s ' \ - 'AND con.confrelid = cl2.oid ' \ - 'AND cl2.relname = %s ' \ - 'AND array_lower(con.conkey, 1) = 1 ' \ - 'AND con.conkey[1] = att1.attnum ' \ - 'AND att1.attrelid = cl1.oid ' \ - 'AND att1.attname = %s ' \ - 'AND array_lower(con.confkey, 1) = 1 ' \ - 'AND con.confkey[1] = att2.attnum ' \ - 'AND att2.attrelid = cl2.oid ' \ - 'AND att2.attname = %s ' \ - 'AND con.contype = \'f\'', (self._table, ref, k, 'id')) + cr.execute('SELECT confdeltype, conname FROM pg_constraint as con, pg_class as cl1, pg_class as cl2, ' + 'pg_attribute as att1, pg_attribute as att2 ' + 'WHERE con.conrelid = cl1.oid ' + 'AND cl1.relname = %s ' + 'AND con.confrelid = cl2.oid ' + 'AND cl2.relname = %s ' + 'AND array_lower(con.conkey, 1) = 1 ' + 'AND con.conkey[1] = att1.attnum ' + 'AND att1.attrelid = cl1.oid ' + 'AND att1.attname = %s ' + 'AND array_lower(con.confkey, 1) = 1 ' + 'AND con.confkey[1] = att2.attnum ' + 'AND att2.attrelid = cl2.oid ' + 'AND att2.attname = %s ' + "AND con.contype = 'f'", (self._table, ref, k, 'id')) res = cr.dictfetchall() if res: confdeltype = { @@ -1592,6 +1592,8 @@ class orm(orm_template): else: print "ERROR" for f,k in todo_update_store: + ss = self._columns[k]._symbol_set + update_query = 'UPDATE "%s" SET "%s"=%s WHERE id=%%s' % (self._table, k, ss[0]) cr.execute('select id from '+self._table) ids_lst = map(lambda x: x[0], cr.fetchall()) while ids_lst: @@ -1602,19 +1604,21 @@ class orm(orm_template): if f._multi: val = val[k] if (val<>False) or (type(val)<>bool): - cr.execute("UPDATE \"%s\" SET \"%s\"='%s' where id=%d"% (self._table, k, val, key)) + #cr.execute("UPDATE \"%s\" SET \"%s\"='%s' where id=%d"% (self._table, k, val, key)) + cr.execute(update_query, (ss[1](val), key)) #else: # cr.execute("UPDATE \"%s\" SET \"%s\"=NULL where id=%d"% (self._table, k, key)) else: - cr.execute("SELECT relname FROM pg_class WHERE relkind in ('r','v') AND relname='%s'" % self._table) + cr.execute("SELECT relname FROM pg_class WHERE relkind in ('r','v') AND relname=%s", (self._table,)) create = not bool(cr.fetchone()) for (key, con, _) in self._sql_constraints: - cr.execute("SELECT conname FROM pg_constraint where conname='%s_%s'" % (self._table, key)) + conname = '%s_%s' % (self._table, key) + cr.execute("SELECT conname FROM pg_constraint where conname=%s", (conname,)) if not cr.dictfetchall(): try: - cr.execute('alter table \"%s\" add constraint \"%s_%s\" %s' % (self._table, self._table, key, con,)) + cr.execute('alter table "%s" add constraint "%s_%s" %s' % (self._table, self._table, key, con,)) cr.commit() except: logger.notifyChannel('init', netsvc.LOG_WARNING, 'unable to add \'%s\' constraint on table %s !\n If you want to have it, you should update the records and execute manually:\nALTER table %s ADD CONSTRAINT %s_%s %s' % (con, self._table, self._table, self._table, key, con,)) @@ -1836,7 +1840,6 @@ class orm(orm_template): if isinstance(self._columns[f], fields.binary) and context.get('bin_size', False): return "length(%s) as %s" % (f,f) return '"%s"' % (f,) - #fields_pre2 = map(lambda x: (x in ('create_date', 'write_date')) and ('date_trunc(\'second\', '+x+') as '+x) or '"'+x+'"', fields_pre) fields_pre2 = map(convert_field, fields_pre) for i in range(0, len(ids), cr.IN_MAX): sub_ids = ids[i:i+cr.IN_MAX] @@ -1888,7 +1891,7 @@ class orm(orm_template): # to get the _symbol_get in each occurence for r in res: for f in fields_post: - r[f] = self.columns[f]._symbol_get(r[f]) + r[f] = self._columns[f]._symbol_get(r[f]) ids = map(lambda x: x['id'], res) # all non inherited fields for which the attribute whose name is in load is False @@ -2022,7 +2025,7 @@ class orm(orm_template): for i in range(0, len(ids), cr.IN_MAX): sub_ids = ids[i:i+cr.IN_MAX] - str_d = string.join(('%d',)*len(sub_ids), ',') + str_d = string.join(('%s',)*len(sub_ids), ',') if d1: cr.execute('SELECT id FROM "'+self._table+'" ' \ 'WHERE id IN ('+str_d+')'+d1, sub_ids+d2) @@ -2139,7 +2142,7 @@ class orm(orm_template): % (vals[field], field)) if self._log_access: - upd0.append('write_uid=%d') + upd0.append('write_uid=%s') upd0.append('write_date=now()') upd1.append(user) @@ -2205,14 +2208,14 @@ class orm(orm_template): if self.pool._init: self.pool._init_parent[self._name]=True else: - cr.execute('select parent_left,parent_right from '+self._table+' where id=%d', (vals[self._parent_name],)) + cr.execute('select parent_left,parent_right from '+self._table+' where id=%s', (vals[self._parent_name],)) res = cr.fetchone() if res: pleft,pright = res else: cr.execute('select max(parent_right),max(parent_right)+1 from '+self._table) pleft,pright = cr.fetchone() - cr.execute('select parent_left,parent_right,id from '+self._table+' where id in ('+','.join(map(lambda x:'%d',ids))+')', ids) + cr.execute('select parent_left,parent_right,id from '+self._table+' where id in ('+','.join(map(lambda x:'%s',ids))+')', ids) dest = pleft + 1 for cleft,cright,cid in cr.fetchall(): if cleft > pleft: @@ -2232,17 +2235,17 @@ class orm(orm_template): cr.execute('UPDATE '+self._table+''' SET parent_left = CASE - WHEN parent_left BETWEEN %d AND %d THEN parent_left + %d - WHEN parent_left BETWEEN %d AND %d THEN parent_left + %d + WHEN parent_left BETWEEN %s AND %s THEN parent_left + %s + WHEN parent_left BETWEEN %s AND %s THEN parent_left + %s ELSE parent_left END, parent_right = CASE - WHEN parent_right BETWEEN %d AND %d THEN parent_right + %d - WHEN parent_right BETWEEN %d AND %d THEN parent_right + %d + WHEN parent_right BETWEEN %s AND %s THEN parent_right + %s + WHEN parent_right BETWEEN %s AND %s THEN parent_right + %s ELSE parent_right END WHERE - parent_left<%d OR parent_right>%d; + parent_left<%s OR parent_right>%s; ''', (leftbound,rightbound,cwidth,cleft,cright,treeshift,leftbound,rightbound, cwidth,cleft,cright,treeshift,leftrange,rightrange)) @@ -2313,7 +2316,7 @@ class orm(orm_template): for table in tocreate: id = self.pool.get(table).create(cr, user, tocreate[table]) upd0 += ','+self._inherits[table] - upd1 += ',%d' + upd1 += ',%s' upd2.append(id) for field in vals: @@ -2343,7 +2346,7 @@ class orm(orm_template): % (vals[field], field)) if self._log_access: upd0 += ',create_uid,create_date' - upd1 += ',%d,now()' + upd1 += ',%s,now()' upd2.append(user) cr.execute('insert into "'+self._table+'" (id'+upd0+") values ("+str(id_new)+upd1+')', tuple(upd2)) upd_todo.sort(lambda x, y: self._columns[x].priority-self._columns[y].priority) @@ -2358,14 +2361,14 @@ class orm(orm_template): else: parent = vals.get(self._parent_name, False) if parent: - cr.execute('select parent_left from '+self._table+' where id=%d', (parent,)) + cr.execute('select parent_left from '+self._table+' where id=%s', (parent,)) pleft = cr.fetchone()[0] else: cr.execute('select max(parent_right) from '+self._table) pleft = cr.fetchone()[0] or 0 - cr.execute('update '+self._table+' set parent_left=parent_left+2 where parent_left>%d', (pleft,)) - cr.execute('update '+self._table+' set parent_right=parent_right+2 where parent_right>%d', (pleft,)) - cr.execute('update '+self._table+' set parent_left=%d,parent_right=%d where id=%d', (pleft+1,pleft+2,id_new)) + cr.execute('update '+self._table+' set parent_left=parent_left+2 where parent_left>%s', (pleft,)) + cr.execute('update '+self._table+' set parent_right=parent_right+2 where parent_right>%s', (pleft,)) + cr.execute('update '+self._table+' set parent_left=%s,parent_right=%s where id=%s', (pleft+1,pleft+2,id_new)) wf_service = netsvc.LocalService("workflow") wf_service.trg_create(user, self._name, id_new, cr) @@ -2394,7 +2397,7 @@ class orm(orm_template): upd1.append(self._columns[field]._symbol_set[1](value)) upd1.append(id) cr.execute('update "' + self._table + '" set ' + \ - string.join(upd0, ',') + ' where id = %d', upd1) + string.join(upd0, ',') + ' where id = %s', upd1) return True # @@ -2492,7 +2495,7 @@ class orm(orm_template): return [] if isinstance(ids, (int, long)): ids = [ids] - return [(r['id'], str(r[self._rec_name])) for r in self.read(cr, user, ids, + return [(r['id'], tools.ustr(r[self._rec_name])) for r in self.read(cr, user, ids, [self._rec_name], context, load='_classic_write')] def name_search(self, cr, user, name='', args=None, operator='ilike', context=None, limit=None): diff --git a/bin/tools/convert.py b/bin/tools/convert.py index ee7c1c53ee8..b063c9ebabe 100644 --- a/bin/tools/convert.py +++ b/bin/tools/convert.py @@ -474,7 +474,7 @@ form: module.record_id""" % (xml_id,) pid = False for idx, menu_elem in enumerate(m_l): if pid: - cr.execute('select id from ir_ui_menu where parent_id=%d and name=%s', (pid, menu_elem)) + cr.execute('select id from ir_ui_menu where parent_id=%s and name=%s', (pid, menu_elem)) else: cr.execute('select id from ir_ui_menu where parent_id is null and name=%s', (menu_elem,)) res = cr.fetchone() @@ -513,15 +513,15 @@ form: module.record_id""" % (xml_id,) values['icon'] = icons.get(a_type,'STOCK_NEW') if a_type=='act_window': a_id = self.id_get(cr, 'ir.actions.%s'% a_type, a_action) - cr.execute('select view_type,view_mode,name,view_id,target from ir_act_window where id=%d', (int(a_id),)) + cr.execute('select view_type,view_mode,name,view_id,target from ir_act_window where id=%s', (int(a_id),)) rrres = cr.fetchone() assert rrres, "No window action defined for this id %s !\n" \ "Verify that this is a window action or add a type argument." % (a_action,) action_type,action_mode,action_name,view_id,target = rrres if view_id: - cr.execute('SELECT type FROM ir_ui_view WHERE id=%d', (int(view_id),)) + cr.execute('SELECT type FROM ir_ui_view WHERE id=%s', (int(view_id),)) action_mode, = cr.fetchone() - cr.execute('SELECT view_mode FROM ir_act_window_view WHERE act_window_id=%d ORDER BY sequence LIMIT 1', (int(a_id),)) + cr.execute('SELECT view_mode FROM ir_act_window_view WHERE act_window_id=%s ORDER BY sequence LIMIT 1', (int(a_id),)) if cr.rowcount: action_mode, = cr.fetchone() if action_type=='tree': @@ -538,7 +538,7 @@ form: module.record_id""" % (xml_id,) values['name'] = action_name elif a_type=='wizard': a_id = self.id_get(cr, 'ir.actions.%s'% a_type, a_action) - cr.execute('select name from ir_act_wizard where id=%d', (int(a_id),)) + cr.execute('select name from ir_act_wizard where id=%s', (int(a_id),)) resw = cr.fetchone() if (not values.get('name', False)) and resw: values['name'] = resw[0] @@ -819,7 +819,7 @@ def convert_csv_import(cr, module, fname, csvcontent, idref=None, mode='init', if (not line) or not reduce(lambda x,y: x or y, line) : continue try: - datas.append( map(lambda x:x.decode('utf8').encode('utf8'), line)) + datas.append(map(lambda x: misc.ustr(x), line)) except: print "ERROR while importing the line: ", line pool.get(model).import_data(cr, uid, fields, datas,mode, module,noupdate,filename=fname_partial) diff --git a/bin/tools/misc.py b/bin/tools/misc.py index 212501a8703..0466de4ad62 100644 --- a/bin/tools/misc.py +++ b/bin/tools/misc.py @@ -68,7 +68,7 @@ def init_db(cr): if p_id is not None: cr.execute('select id \ from ir_module_category \ - where name=%s and parent_id=%d', (categs[0], p_id)) + where name=%s and parent_id=%s', (categs[0], p_id)) else: cr.execute('select id \ from ir_module_category \ @@ -79,7 +79,7 @@ def init_db(cr): c_id = cr.fetchone()[0] cr.execute('insert into ir_module_category \ (id, name, parent_id) \ - values (%d, %s, %d)', (c_id, categs[0], p_id)) + values (%s, %s, %s)', (c_id, categs[0], p_id)) else: c_id = c_id[0] p_id = c_id @@ -99,7 +99,7 @@ def init_db(cr): cr.execute('insert into ir_module_module \ (id, author, latest_version, website, name, shortdesc, description, \ category_id, state) \ - values (%d, %s, %s, %s, %s, %s, %s, %d, %s)', ( + values (%s, %s, %s, %s, %s, %s, %s, %s, %s)', ( id, info.get('author', ''), release.major_version + '.' + info.get('version', ''), info.get('website', ''), i, info.get('name', False), @@ -580,6 +580,28 @@ class cache(object): def to_xml(s): return s.replace('&','&').replace('<','<').replace('>','>') +def ustr(value): + """This method is similar to the builtin `str` method, except + it will return Unicode string. + + @param value: the value to convert + + @rtype: unicode + @return: unicode string + """ + + if isinstance(value, unicode): + return value + + if hasattr(value, '__unicode__'): + return unicode(value) + + if not isinstance(value, str): + value = str(value) + + return unicode(value, 'utf-8') + + def get_languages(): languages={ 'bg_BG': u'Bulgarian / български', @@ -630,7 +652,7 @@ def get_user_companies(cr, user): res=[x[0] for x in cr.fetchall()] res.extend(_get_company_children(cr, res)) return res - cr.execute('SELECT comp.id FROM res_company AS comp, res_users AS u WHERE u.id = %d AND comp.id = u.company_id' % (user,)) + cr.execute('SELECT comp.id FROM res_company AS comp, res_users AS u WHERE u.id = %s AND comp.id = u.company_id' % (user,)) compids=[cr.fetchone()[0]] compids.extend(_get_company_children(cr, compids)) return compids