# HG changeset patch # User jbe # Date 1432251871 -7200 # Node ID 6ad9f6113c52e577dd17194a632097c8dde85933 # Parent 71e2963d9c2c88a09c08931e53de64b32f555dcd Support for primary keys in JSON documents diff -r 71e2963d9c2c -r 6ad9f6113c52 libraries/mondelefant/mondelefant.lua --- a/libraries/mondelefant/mondelefant.lua Sun Mar 29 15:22:00 2015 +0200 +++ b/libraries/mondelefant/mondelefant.lua Fri May 22 01:44:31 2015 +0200 @@ -1078,8 +1078,15 @@ end local primary_key = self._class:get_primary_key_list() local primary_key_sql = { sep = ", " } - for idx, value in ipairs(primary_key) do - primary_key_sql[idx] = '"' .. value .. '"' + if primary_key.json_doc then + primary_key_sql[1] = { + '("$"->>?)::$ AS "json_key"', + {primary_key.json_doc}, primary_key.key, {primary_key.type} + } + else + for idx, value in ipairs(primary_key) do + primary_key_sql[idx] = '"' .. value .. '"' + end end if self._new then local fields = {sep = ", "} @@ -1088,52 +1095,34 @@ add(fields, {'"$"', {key}}) add(values, {'?', self[key]}) end - if compat_returning then -- compatibility for PostgreSQL 8.1 - local db_error, db_result1, db_result2 = self._connection:try_query( + local db_error, db_result + if #fields == 0 then + db_error, db_result = self._connection:try_query( { - 'INSERT INTO $ ($) VALUES ($)', + 'INSERT INTO $ DEFAULT VALUES RETURNING ($)', + {self._class:get_qualified_table()}, + primary_key_sql + }, + "object" + ) + else + db_error, db_result = self._connection:try_query( + { + 'INSERT INTO $ ($) VALUES ($) RETURNING ($)', {self._class:get_qualified_table()}, fields, values, primary_key_sql }, - "list", - { - 'SELECT currval(?)', - self._class.table .. '_id_seq' - }, "object" ) - if db_error then - return db_error - end - self.id = db_result2.id + end + if db_error then + return db_error + end + if primary_key.json_doc then + self[primary_key.json_doc][primary_key.key] = db_result.json_key else - local db_error, db_result - if #fields == 0 then - db_error, db_result = self._connection:try_query( - { - 'INSERT INTO $ DEFAULT VALUES RETURNING ($)', - {self._class:get_qualified_table()}, - primary_key_sql - }, - "object" - ) - else - db_error, db_result = self._connection:try_query( - { - 'INSERT INTO $ ($) VALUES ($) RETURNING ($)', - {self._class:get_qualified_table()}, - fields, - values, - primary_key_sql - }, - "object" - ) - end - if db_error then - return db_error - end for idx, value in ipairs(primary_key) do self[value] = db_result[value] end @@ -1146,12 +1135,20 @@ end if #command_sets >= 1 then local primary_key_compare = {sep = " AND "} - for idx, value in ipairs(primary_key) do - primary_key_compare[idx] = { - "$ = ?", - {'"' .. value .. '"'}, - self[value] + if primary_key.json_doc then + primary_key_compare[1] = { + '("$"->>?)::$ = ?', + {primary_key.json_doc}, primary_key.key, {primary_key.type}, + self[primary_key.json_doc][primary_key.key] } + else + for idx, value in ipairs(primary_key) do + primary_key_compare[idx] = { + "$ = ?", + {'"' .. value .. '"'}, + self[value] + } + end end local db_error = self._connection:try_query{ 'UPDATE $ SET $ WHERE $', @@ -1196,12 +1193,20 @@ end local primary_key = self._class:get_primary_key_list() local primary_key_compare = {sep = " AND "} - for idx, value in ipairs(primary_key) do - primary_key_compare[idx] = { - "$ = ?", - {'"' .. value .. '"'}, - self[value] + if primary_key.json_doc then + primary_key_compare[1] = { + '("$"->>?)::$ = ?', + {primary_key.json_doc}, primary_key.key, {primary_key.type}, + self[primary_key.json_doc][primary_key.key] } + else + for idx, value in ipairs(primary_key) do + primary_key_compare[idx] = { + "$ = ?", + {'"' .. value .. '"'}, + self[value] + } + end end return self._connection:try_query{ 'DELETE FROM $ WHERE $',