mirror of
https://bitbucket.org/theswgsource/src-1.2.git
synced 2026-07-14 00:01:30 -04:00
182 lines
4.7 KiB
SQL
182 lines
4.7 KiB
SQL
-- SQL script for the publish process
|
|
|
|
whenever sqlerror exit failure rollback
|
|
set verify off
|
|
set serveroutput on
|
|
|
|
-- save player locations
|
|
delete publish_player_fixup;
|
|
|
|
declare
|
|
type curtype is ref cursor;
|
|
playerlist curtype;
|
|
player_id number;
|
|
topmost_container number;
|
|
new_x number;
|
|
new_y number;
|
|
new_z number;
|
|
begin
|
|
open playerlist for
|
|
select object_id
|
|
from objects o, players p
|
|
where object_id >= &&min_running_object_id
|
|
and player_controlled = 'Y'
|
|
and deleted = 0
|
|
and contained_by <> 0
|
|
and object_id = character_object;
|
|
|
|
loop
|
|
begin
|
|
fetch playerlist into player_id;
|
|
exit when playerlist%notfound;
|
|
|
|
select x,y,z
|
|
into new_x, new_y, new_z
|
|
from objects
|
|
where contained_by = 0
|
|
start with object_id = player_id
|
|
connect by prior contained_by = object_id;
|
|
|
|
insert into publish_player_fixup
|
|
values (player_id, new_x, new_y, new_z);
|
|
|
|
exception
|
|
when no_data_found then
|
|
-- put the player at origin (best we can do)
|
|
insert into publish_player_fixup
|
|
values (player_id, 0,0,0);
|
|
when others then
|
|
dbms_output.put_line('Player '|| player_id || ' is contained by his own inventory');
|
|
insert into publish_player_fixup
|
|
values (player_id, 0,0,0);
|
|
end;
|
|
end loop;
|
|
close playerlist;
|
|
end;
|
|
/
|
|
|
|
-- delete objects that will be replaced by the publish
|
|
|
|
declare
|
|
type curtype is ref cursor;
|
|
tablelist curtype;
|
|
tablename varchar2(200);
|
|
begin
|
|
dbms_output.enable(20000);
|
|
|
|
open tablelist for
|
|
select distinct table_name
|
|
from user_tab_columns
|
|
where column_name = 'OBJECT_ID'
|
|
and table_name <> 'OBJECTS'
|
|
and table_name <> 'OBJECT_LIST'
|
|
and table_name <> 'MLOG$_OBJECTS'
|
|
and table_name <> 'OBJECTS$OEM0'
|
|
and table_name <> 'OBJECT_VARIABLES'
|
|
and table_name not like '%VIEW%';
|
|
|
|
loop
|
|
fetch tablelist into tablename;
|
|
exit when tablelist%notfound;
|
|
dbms_output.put_line(tablename);
|
|
--dbms_output.put_line('delete ' || tablename || ' where not exists (select * from objects where objects.object_id = '|| tablename || '.object_id);');
|
|
execute immediate 'delete ' || tablename || ' where object_id < &&min_running_object_id';
|
|
end loop;
|
|
close tablelist;
|
|
end;
|
|
/
|
|
|
|
delete objects
|
|
where object_id < &&min_running_object_id;
|
|
|
|
insert into objects
|
|
select *
|
|
from &&source_schema..objects
|
|
where object_id < &&min_running_object_id;
|
|
|
|
declare
|
|
type curtype is ref cursor;
|
|
tablelist curtype;
|
|
tablename varchar2(200);
|
|
begin
|
|
dbms_output.enable(20000);
|
|
|
|
open tablelist for
|
|
select distinct table_name
|
|
from user_tab_columns
|
|
where column_name = 'OBJECT_ID'
|
|
and table_name <> 'OBJECTS'
|
|
and table_name <> 'OBJECT_LIST'
|
|
and table_name not like '%$%'
|
|
and table_name <> 'MLOG$_OBJECTS'
|
|
and table_name <> 'OBJECTS$OEM0'
|
|
and table_name <> 'RUPD$_OBJECTS'
|
|
and table_name <> 'OBJECT_VARIABLES'
|
|
and table_name not like '%VIEW%';
|
|
|
|
loop
|
|
fetch tablelist into tablename;
|
|
exit when tablelist%notfound;
|
|
dbms_output.put_line(tablename);
|
|
--dbms_output.put_line('delete ' || tablename || ' where not exists (select * from objects where objects.object_id = '|| tablename || '.object_id);');
|
|
execute immediate 'insert into ' || tablename || ' select * from &&source_schema..' || tablename || ' where object_id < &&min_running_object_id';
|
|
end loop;
|
|
close tablelist;
|
|
end;
|
|
/
|
|
|
|
-- copy object variables
|
|
|
|
delete object_variables
|
|
where object_id < &&min_running_object_id;
|
|
|
|
begin
|
|
for x in (select distinct name
|
|
from &&source_schema..object_variable_names n1
|
|
where not exists (select 1 from object_variable_names n2 where n1.name = n2.name))
|
|
loop
|
|
insert into object_variable_names (id,name)
|
|
values (next_object_variable_name.nextval,x.name);
|
|
end loop;
|
|
end;
|
|
/
|
|
|
|
insert into object_variables
|
|
select object_id,dn.id,type,value,sv.detached
|
|
from &&source_schema..object_variables sv, &&source_schema..object_variable_names sn, object_variable_names dn
|
|
where sv.name_id = sn.id
|
|
and (sv.detached = 0 or sv.detached is null)
|
|
and sn.name = dn.name;
|
|
|
|
-- delete all universe objects that were copied
|
|
|
|
update objects
|
|
set deleted = (select reason_code from delete_reasons where tag='Publish')
|
|
where deleted = 0
|
|
and object_id in
|
|
(select object_id
|
|
from universe_objects)
|
|
and object_id < &&min_running_object_id;
|
|
|
|
-- fix any players that are now in deleted buildings
|
|
|
|
update objects
|
|
set x=(select x from publish_player_fixup where player_object_id = object_id),
|
|
y=(select y from publish_player_fixup where player_object_id = object_id),
|
|
z=(select z from publish_player_fixup where player_object_id = object_id),
|
|
contained_by = 0
|
|
where object_id in
|
|
(select o1.object_id
|
|
from objects o1, objects o2, players p
|
|
where o1.deleted = 0
|
|
and o1.object_id >= &&min_running_object_id
|
|
and o1.player_controlled = 'Y'
|
|
and o1.object_id = p.character_object -- to help it find them faster
|
|
and o1.contained_by = o2.object_id (+)
|
|
and nvl(o2.deleted,1) <> 0)
|
|
and contained_by <> 0;
|
|
|
|
commit;
|
|
|
|
@wipe_npcs_no_objvar
|