webmcp

changeset 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 32b64f641761
children 11ef7ab67e43
files libraries/mondelefant/mondelefant.lua
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 $',

Impressum / About Us