And introduce safe_jsonb_setmerge-requests/1875/head
@@ -28,7 +28,7 @@ defmodule Mix.Tasks.Pleroma.Database do | |||||
Logger.info("Removing embedded objects") | Logger.info("Removing embedded objects") | ||||
Repo.query!( | 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 | timeout: :infinity | ||||
) | ) | ||||
@@ -126,7 +126,7 @@ defmodule Mix.Tasks.Pleroma.Database do | |||||
set: [ | set: [ | ||||
data: | data: | ||||
fragment( | fragment( | ||||
"jsonb_set(?, '{likes}', '[]'::jsonb, true)", | |||||
"safe_jsonb_set(?, '{likes}', '[]'::jsonb, true)", | |||||
object.data | object.data | ||||
) | ) | ||||
] | ] | ||||
@@ -181,7 +181,7 @@ defmodule Pleroma.Object do | |||||
data: | data: | ||||
fragment( | fragment( | ||||
""" | """ | ||||
jsonb_set(?, '{repliesCount}', | |||||
safe_jsonb_set(?, '{repliesCount}', | |||||
(coalesce((?->>'repliesCount')::int, 0) + 1)::varchar::jsonb, true) | (coalesce((?->>'repliesCount')::int, 0) + 1)::varchar::jsonb, true) | ||||
""", | """, | ||||
o.data, | o.data, | ||||
@@ -204,7 +204,7 @@ defmodule Pleroma.Object do | |||||
data: | data: | ||||
fragment( | fragment( | ||||
""" | """ | ||||
jsonb_set(?, '{repliesCount}', | |||||
safe_jsonb_set(?, '{repliesCount}', | |||||
(greatest(0, (?->>'repliesCount')::int - 1))::varchar::jsonb, true) | (greatest(0, (?->>'repliesCount')::int - 1))::varchar::jsonb, true) | ||||
""", | """, | ||||
o.data, | o.data, | ||||
@@ -727,7 +727,7 @@ defmodule Pleroma.User do | |||||
set: [ | set: [ | ||||
info: | info: | ||||
fragment( | 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, | ||||
u.info | u.info | ||||
) | ) | ||||
@@ -748,7 +748,7 @@ defmodule Pleroma.User do | |||||
set: [ | set: [ | ||||
info: | info: | ||||
fragment( | 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, | ||||
u.info | u.info | ||||
) | ) | ||||
@@ -818,7 +818,7 @@ defmodule Pleroma.User do | |||||
set: [ | set: [ | ||||
info: | info: | ||||
fragment( | fragment( | ||||
"jsonb_set(?, '{follower_count}', ?::varchar::jsonb, true)", | |||||
"safe_jsonb_set(?, '{follower_count}', ?::varchar::jsonb, true)", | |||||
u.info, | u.info, | ||||
s.count | s.count | ||||
) | ) | ||||
@@ -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 |
@@ -4,7 +4,7 @@ defmodule Pleroma.Repo.Migrations.CopyMutedToMutedNotifications do | |||||
def change do | def change do | ||||
execute( | 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 | ||||
end | end |