async def update(self, where, params, data): # Without INDEX we can do only INSERT # With INDEX we will do UPDATE if 'index' not in params.keys(): return await self.insert(where, params, data) data = fixed_dump(data) # FIXME query = "update {table} set {key}=jsonb_set({key}, '{{{index}}}', '{data}'::jsonb) ".format( # nosec table=self.table, key=self.__key_name__, data=data.replace("'", ""), index=params['index'] ) del params['index'] query += ' where {where} RETURNING jsonb_array_length({key}) as r'.format( key=self.__key_name__, where=self.sql.prepare_where(where, params) ) result = await self.sql.execute(query, params) result = int(result.replace('UPDATE ', '')) return result
async def insert(self, where, params, data): data = fixed_dump(data) query = "update {table} set {key}=jsonb_set({key}, concat('{{'," query += " jsonb_array_length({key}),'}}')::text[], '{data}'::jsonb) " query = query.format( table=self.table, key=self.__key_name__, data=data.replace("'", ""), ) query += ' where {where} RETURNING jsonb_array_length({key}) as r'.format( key=self.__key_name__, where=self.sql.prepare_where(where, params)) result = await self.sql.execute(query, params) result = int(result.replace('UPDATE ', '')) if result == 0: raise Exception('{"status": "No object updated"}') return result
def _encoder(value): val = bytes(fixed_dump(value).encode('utf-8')) val = b'\x01' + val return val