webmcp
diff libraries/mondelefant/mondelefant.lua @ 373:7674d59521f8
Support for primary keys in JSON documents (fixes mistake with extra parenthesis in RETURN clause)
author | jbe |
---|---|
date | Sat Nov 14 02:11:44 2015 +0100 (2015-11-14) |
parents | 3995f9d2d610 |
children | fb98b17056e5 |
line diff
1.1 --- a/libraries/mondelefant/mondelefant.lua Sat Aug 22 18:19:11 2015 +0200 1.2 +++ b/libraries/mondelefant/mondelefant.lua Sat Nov 14 02:11:44 2015 +0100 1.3 @@ -1078,8 +1078,15 @@ 1.4 end 1.5 local primary_key = self._class:get_primary_key_list() 1.6 local primary_key_sql = { sep = ", " } 1.7 - for idx, value in ipairs(primary_key) do 1.8 - primary_key_sql[idx] = '"' .. value .. '"' 1.9 + if primary_key.json_doc then 1.10 + primary_key_sql[1] = { 1.11 + '("$"->>?)::$ AS "json_key"', 1.12 + {primary_key.json_doc}, primary_key.key, {primary_key.type} 1.13 + } 1.14 + else 1.15 + for idx, value in ipairs(primary_key) do 1.16 + primary_key_sql[idx] = '"' .. value .. '"' 1.17 + end 1.18 end 1.19 if self._new then 1.20 local fields = {sep = ", "} 1.21 @@ -1088,52 +1095,34 @@ 1.22 add(fields, {'"$"', {key}}) 1.23 add(values, {'?', self[key]}) 1.24 end 1.25 - if compat_returning then -- compatibility for PostgreSQL 8.1 1.26 - local db_error, db_result1, db_result2 = self._connection:try_query( 1.27 + local db_error, db_result 1.28 + if #fields == 0 then 1.29 + db_error, db_result = self._connection:try_query( 1.30 { 1.31 - 'INSERT INTO $ ($) VALUES ($)', 1.32 + 'INSERT INTO $ DEFAULT VALUES RETURNING $', 1.33 + {self._class:get_qualified_table()}, 1.34 + primary_key_sql 1.35 + }, 1.36 + "object" 1.37 + ) 1.38 + else 1.39 + db_error, db_result = self._connection:try_query( 1.40 + { 1.41 + 'INSERT INTO $ ($) VALUES ($) RETURNING $', 1.42 {self._class:get_qualified_table()}, 1.43 fields, 1.44 values, 1.45 primary_key_sql 1.46 }, 1.47 - "list", 1.48 - { 1.49 - 'SELECT currval(?)', 1.50 - self._class.table .. '_id_seq' 1.51 - }, 1.52 "object" 1.53 ) 1.54 - if db_error then 1.55 - return db_error 1.56 - end 1.57 - self.id = db_result2.id 1.58 + end 1.59 + if db_error then 1.60 + return db_error 1.61 + end 1.62 + if primary_key.json_doc then 1.63 + self[primary_key.json_doc][primary_key.key] = db_result.json_key 1.64 else 1.65 - local db_error, db_result 1.66 - if #fields == 0 then 1.67 - db_error, db_result = self._connection:try_query( 1.68 - { 1.69 - 'INSERT INTO $ DEFAULT VALUES RETURNING ($)', 1.70 - {self._class:get_qualified_table()}, 1.71 - primary_key_sql 1.72 - }, 1.73 - "object" 1.74 - ) 1.75 - else 1.76 - db_error, db_result = self._connection:try_query( 1.77 - { 1.78 - 'INSERT INTO $ ($) VALUES ($) RETURNING ($)', 1.79 - {self._class:get_qualified_table()}, 1.80 - fields, 1.81 - values, 1.82 - primary_key_sql 1.83 - }, 1.84 - "object" 1.85 - ) 1.86 - end 1.87 - if db_error then 1.88 - return db_error 1.89 - end 1.90 for idx, value in ipairs(primary_key) do 1.91 self[value] = db_result[value] 1.92 end 1.93 @@ -1146,12 +1135,20 @@ 1.94 end 1.95 if #command_sets >= 1 then 1.96 local primary_key_compare = {sep = " AND "} 1.97 - for idx, value in ipairs(primary_key) do 1.98 - primary_key_compare[idx] = { 1.99 - "$ = ?", 1.100 - {'"' .. value .. '"'}, 1.101 - self[value] 1.102 + if primary_key.json_doc then 1.103 + primary_key_compare[1] = { 1.104 + '("$"->>?)::$ = ?', 1.105 + {primary_key.json_doc}, primary_key.key, {primary_key.type}, 1.106 + self[primary_key.json_doc][primary_key.key] 1.107 } 1.108 + else 1.109 + for idx, value in ipairs(primary_key) do 1.110 + primary_key_compare[idx] = { 1.111 + "$ = ?", 1.112 + {'"' .. value .. '"'}, 1.113 + self[value] 1.114 + } 1.115 + end 1.116 end 1.117 local db_error = self._connection:try_query{ 1.118 'UPDATE $ SET $ WHERE $', 1.119 @@ -1196,12 +1193,20 @@ 1.120 end 1.121 local primary_key = self._class:get_primary_key_list() 1.122 local primary_key_compare = {sep = " AND "} 1.123 - for idx, value in ipairs(primary_key) do 1.124 - primary_key_compare[idx] = { 1.125 - "$ = ?", 1.126 - {'"' .. value .. '"'}, 1.127 - self[value] 1.128 + if primary_key.json_doc then 1.129 + primary_key_compare[1] = { 1.130 + '("$"->>?)::$ = ?', 1.131 + {primary_key.json_doc}, primary_key.key, {primary_key.type}, 1.132 + self[primary_key.json_doc][primary_key.key] 1.133 } 1.134 + else 1.135 + for idx, value in ipairs(primary_key) do 1.136 + primary_key_compare[idx] = { 1.137 + "$ = ?", 1.138 + {'"' .. value .. '"'}, 1.139 + self[value] 1.140 + } 1.141 + end 1.142 end 1.143 return self._connection:try_query{ 1.144 'DELETE FROM $ WHERE $',