Browse Source

Merge branch 'backport/develop-safe-jsonb' into 'develop'

Backport safe_jsonb_set fixes to develop

See merge request pleroma/pleroma!1858
merge-requests/1875/head
rinpatch 4 years ago
parent
commit
30a59ae97d
6 changed files with 42 additions and 8 deletions
  1. +2
    -2
      lib/mix/tasks/pleroma/database.ex
  2. +2
    -2
      lib/pleroma/object.ex
  3. +3
    -3
      lib/pleroma/user.ex
  4. +22
    -0
      priv/repo/migrations/20190711042021_create_safe_jsonb_set.exs
  5. +1
    -1
      priv/repo/migrations/20190711042024_copy_muted_to_muted_notifications.exs
  6. +12
    -0
      test/safe_jsonb_set_test.exs

+ 2
- 2
lib/mix/tasks/pleroma/database.ex View File

@@ -28,7 +28,7 @@ defmodule Mix.Tasks.Pleroma.Database do
Logger.info("Removing embedded objects")

Repo.query!(
"update activities set data = jsonb_set(data, '{object}'::text[], data->'object'->'id') where data->'object'->>'id' is not null;",
"update activities set data = safe_jsonb_set(data, '{object}'::text[], data->'object'->'id') where data->'object'->>'id' is not null;",
[],
timeout: :infinity
)
@@ -126,7 +126,7 @@ defmodule Mix.Tasks.Pleroma.Database do
set: [
data:
fragment(
"jsonb_set(?, '{likes}', '[]'::jsonb, true)",
"safe_jsonb_set(?, '{likes}', '[]'::jsonb, true)",
object.data
)
]


+ 2
- 2
lib/pleroma/object.ex View File

@@ -181,7 +181,7 @@ defmodule Pleroma.Object do
data:
fragment(
"""
jsonb_set(?, '{repliesCount}',
safe_jsonb_set(?, '{repliesCount}',
(coalesce((?->>'repliesCount')::int, 0) + 1)::varchar::jsonb, true)
""",
o.data,
@@ -204,7 +204,7 @@ defmodule Pleroma.Object do
data:
fragment(
"""
jsonb_set(?, '{repliesCount}',
safe_jsonb_set(?, '{repliesCount}',
(greatest(0, (?->>'repliesCount')::int - 1))::varchar::jsonb, true)
""",
o.data,


+ 3
- 3
lib/pleroma/user.ex View File

@@ -727,7 +727,7 @@ defmodule Pleroma.User do
set: [
info:
fragment(
"jsonb_set(?, '{note_count}', ((?->>'note_count')::int + 1)::varchar::jsonb, true)",
"safe_jsonb_set(?, '{note_count}', ((?->>'note_count')::int + 1)::varchar::jsonb, true)",
u.info,
u.info
)
@@ -748,7 +748,7 @@ defmodule Pleroma.User do
set: [
info:
fragment(
"jsonb_set(?, '{note_count}', (greatest(0, (?->>'note_count')::int - 1))::varchar::jsonb, true)",
"safe_jsonb_set(?, '{note_count}', (greatest(0, (?->>'note_count')::int - 1))::varchar::jsonb, true)",
u.info,
u.info
)
@@ -818,7 +818,7 @@ defmodule Pleroma.User do
set: [
info:
fragment(
"jsonb_set(?, '{follower_count}', ?::varchar::jsonb, true)",
"safe_jsonb_set(?, '{follower_count}', ?::varchar::jsonb, true)",
u.info,
s.count
)


+ 22
- 0
priv/repo/migrations/20190711042021_create_safe_jsonb_set.exs View File

@@ -0,0 +1,22 @@
defmodule Pleroma.Repo.Migrations.CreateSafeJsonbSet do
use Ecto.Migration
alias Pleroma.User

def change do
execute("""
create or replace function safe_jsonb_set(target jsonb, path text[], new_value jsonb, create_missing boolean default true) returns jsonb as $$
declare
result jsonb;
begin
result := jsonb_set(target, path, coalesce(new_value, 'null'::jsonb), create_missing);
if result is NULL then
raise 'jsonb_set tried to wipe the object, please report this incindent to Pleroma bug tracker. https://git.pleroma.social/pleroma/pleroma/issues/new';
return target;
else
return result;
end if;
end;
$$ language plpgsql;
""")
end
end

+ 1
- 1
priv/repo/migrations/20190711042024_copy_muted_to_muted_notifications.exs View File

@@ -4,7 +4,7 @@ defmodule Pleroma.Repo.Migrations.CopyMutedToMutedNotifications do

def change do
execute(
"update users set info = jsonb_set(info, '{muted_notifications}', info->'mutes', true) where local = true"
"update users set info = safe_jsonb_set(info, '{muted_notifications}', info->'mutes', true) where local = true"
)
end
end

+ 12
- 0
test/safe_jsonb_set_test.exs View File

@@ -0,0 +1,12 @@
defmodule Pleroma.SafeJsonbSetTest do
use Pleroma.DataCase

test "it doesn't wipe the object when asked to set the value to NULL" do
assert %{rows: [[%{"key" => "value", "test" => nil}]]} =
Ecto.Adapters.SQL.query!(
Pleroma.Repo,
"select safe_jsonb_set('{\"key\": \"value\"}'::jsonb, '{test}', NULL);",
[]
)
end
end

Loading…
Cancel
Save