mirror of
https://github.com/tgdrive/teldrive.git
synced 2025-01-11 01:28:27 +08:00
188 lines
2.4 KiB
MySQL
188 lines
2.4 KiB
MySQL
|
-- +goose Up
|
||
|
|
||
|
-- +goose StatementBegin
|
||
|
create procedure teldrive.update_size() language plpgsql as $$
|
||
|
declare rec record;
|
||
|
|
||
|
total_size bigint;
|
||
|
|
||
|
begin
|
||
|
|
||
|
for rec in
|
||
|
select
|
||
|
id
|
||
|
from
|
||
|
files
|
||
|
where
|
||
|
type = 'folder'
|
||
|
order by
|
||
|
depth desc loop total_size := (
|
||
|
select
|
||
|
sum(size) as total_size
|
||
|
from
|
||
|
teldrive.files
|
||
|
where
|
||
|
parent_id = rec.id
|
||
|
);
|
||
|
|
||
|
update
|
||
|
teldrive.files
|
||
|
set
|
||
|
size = total_size
|
||
|
where
|
||
|
id = rec.id;
|
||
|
end loop;
|
||
|
end;
|
||
|
|
||
|
$$;
|
||
|
-- +goose StatementEnd
|
||
|
|
||
|
|
||
|
-- +goose StatementBegin
|
||
|
create function teldrive.update_folder(folder_id text,
|
||
|
new_name text default null,
|
||
|
new_path text default null)
|
||
|
returns setof teldrive.files
|
||
|
language plpgsql
|
||
|
as $$
|
||
|
declare folder record;
|
||
|
|
||
|
path_items text [];
|
||
|
|
||
|
begin
|
||
|
|
||
|
if new_path is null then
|
||
|
select
|
||
|
*
|
||
|
into
|
||
|
folder
|
||
|
from
|
||
|
teldrive.files
|
||
|
where
|
||
|
id = folder_id;
|
||
|
|
||
|
path_items := string_to_array(folder.path,
|
||
|
'/');
|
||
|
|
||
|
path_items [array_length(path_items,
|
||
|
1)] := new_name;
|
||
|
|
||
|
new_path := array_to_string(path_items,
|
||
|
'/');
|
||
|
end if;
|
||
|
|
||
|
update
|
||
|
teldrive.files
|
||
|
set
|
||
|
path = new_path,
|
||
|
name = new_name
|
||
|
where
|
||
|
id = folder_id;
|
||
|
|
||
|
for folder in
|
||
|
select
|
||
|
*
|
||
|
from
|
||
|
teldrive.files
|
||
|
where
|
||
|
type = 'folder'
|
||
|
and parent_id = folder_id loop call teldrive.update_folder(
|
||
|
folder.id,
|
||
|
folder.name,
|
||
|
concat(new_path,
|
||
|
'/',
|
||
|
folder.name)
|
||
|
);
|
||
|
end loop;
|
||
|
|
||
|
return query
|
||
|
select
|
||
|
*
|
||
|
from
|
||
|
teldrive.files
|
||
|
where
|
||
|
id = folder_id;
|
||
|
end;
|
||
|
|
||
|
$$
|
||
|
;
|
||
|
-- +goose StatementEnd
|
||
|
|
||
|
-- +goose StatementBegin
|
||
|
create procedure teldrive.delete_files(in file_ids text[],
|
||
|
in op text default 'bulk')
|
||
|
language plpgsql
|
||
|
as $$
|
||
|
declare
|
||
|
rec record;
|
||
|
|
||
|
begin
|
||
|
if op = 'bulk' then
|
||
|
for rec in
|
||
|
select
|
||
|
id,
|
||
|
type
|
||
|
from
|
||
|
teldrive.files
|
||
|
where
|
||
|
id = any (file_ids)
|
||
|
loop
|
||
|
if rec.type = 'folder' then
|
||
|
call teldrive.delete_files(array [rec.id],
|
||
|
'single');
|
||
|
|
||
|
delete
|
||
|
from
|
||
|
teldrive.files
|
||
|
where
|
||
|
id = rec.id;
|
||
|
else
|
||
|
update
|
||
|
teldrive.files
|
||
|
set
|
||
|
status = 'pending_deletion'
|
||
|
where
|
||
|
id = rec.id;
|
||
|
end if;
|
||
|
end loop;
|
||
|
else
|
||
|
|
||
|
for rec in
|
||
|
select
|
||
|
id,
|
||
|
type
|
||
|
from
|
||
|
teldrive.files
|
||
|
where
|
||
|
parent_id = file_ids[1]
|
||
|
loop
|
||
|
if rec.type = 'folder' then
|
||
|
call teldrive.delete_files(array [rec.id],
|
||
|
'single');
|
||
|
|
||
|
delete
|
||
|
from
|
||
|
teldrive.files
|
||
|
where
|
||
|
id = rec.id;
|
||
|
else
|
||
|
update
|
||
|
teldrive.files
|
||
|
set
|
||
|
status = 'pending_deletion'
|
||
|
where
|
||
|
id = rec.id;
|
||
|
end if;
|
||
|
end loop;
|
||
|
end if;
|
||
|
end;
|
||
|
|
||
|
$$
|
||
|
;
|
||
|
-- +goose StatementEnd
|
||
|
|
||
|
|
||
|
-- +goose Down
|
||
|
drop procedure if exists teldrive.update_size;
|
||
|
drop function if exists teldrive.update_folder;
|
||
|
drop procedure if exists teldrive.delete_files;
|