# HG changeset patch # User jbe # Date 1447463504 -3600 # Node ID 7674d59521f8a93e334964702e7cd5ced16cbd97 # Parent 32b64f641761ad8106014e75da0dea94fbb4468a Support for primary keys in JSON documents (fixes mistake with extra parenthesis in RETURN clause) diff -r 32b64f641761 -r 7674d59521f8 libraries/mondelefant/mondelefant.lua --- a/libraries/mondelefant/mondelefant.lua Sat Aug 22 18:19:11 2015 +0200 +++ b/libraries/mondelefant/mondelefant.lua Sat Nov 14 02:11:44 2015 +0100 @@ -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 $',