Files
src/game/server/database/item_conversion/test/conversion_test.plsql
T
2014-01-17 07:03:16 -07:00

212 lines
7.2 KiB
Plaintext

create or replace package body conversion_test
as
type ObjvarsType is table of cnvtest_objvars%rowtype index by varchar2(500);
objvars ObjvarsType;
type RemovedScriptsType is varray(100) of varchar2(102);
removedScripts RemovedScriptsType;
maxErrors number := 0;
numErrors number;
isInitialized boolean := false;
procedure setupData;
procedure checkObjVar (object_id number, name varchar2, value varchar2);
procedure registerErrorWithTemplateId (p_object_id number, p_template_id number, p_description varchar2);
procedure registerError (p_object_id number, p_description varchar2);
procedure testObjects as
begin
setupData;
for objectRow in (select * from objects)
loop
if (removedScripts.count <> 0) then
for i in removedScripts.first .. removedScripts.last
loop
if (objectRow.script_list like removedScripts(i)) then
registerErrorWithTemplateId (objectRow.object_id, objectRow.object_template_id, 'has deprecated scripts (objects table)');
exit;
end if;
end loop;
end if;
checkObjVar(objectRow.object_id, objectRow.objvar_0_name, objectRow.objvar_0_value);
checkObjVar(objectRow.object_id, objectRow.objvar_1_name, objectRow.objvar_1_value);
checkObjVar(objectRow.object_id, objectRow.objvar_2_name, objectRow.objvar_2_value);
checkObjVar(objectRow.object_id, objectRow.objvar_3_name, objectRow.objvar_3_value);
checkObjVar(objectRow.object_id, objectRow.objvar_4_name, objectRow.objvar_4_value);
checkObjVar(objectRow.object_id, objectRow.objvar_5_name, objectRow.objvar_5_value);
checkObjVar(objectRow.object_id, objectRow.objvar_6_name, objectRow.objvar_6_value);
checkObjVar(objectRow.object_id, objectRow.objvar_7_name, objectRow.objvar_7_value);
checkObjVar(objectRow.object_id, objectRow.objvar_8_name, objectRow.objvar_8_value);
checkObjVar(objectRow.object_id, objectRow.objvar_9_name, objectRow.objvar_9_value);
checkObjVar(objectRow.object_id, objectRow.objvar_10_name, objectRow.objvar_10_value);
checkObjVar(objectRow.object_id, objectRow.objvar_11_name, objectRow.objvar_11_value);
checkObjVar(objectRow.object_id, objectRow.objvar_12_name, objectRow.objvar_12_value);
checkObjVar(objectRow.object_id, objectRow.objvar_13_name, objectRow.objvar_13_value);
checkObjVar(objectRow.object_id, objectRow.objvar_14_name, objectRow.objvar_14_value);
checkObjVar(objectRow.object_id, objectRow.objvar_15_name, objectRow.objvar_15_value);
checkObjVar(objectRow.object_id, objectRow.objvar_16_name, objectRow.objvar_16_value);
checkObjVar(objectRow.object_id, objectRow.objvar_17_name, objectRow.objvar_17_value);
checkObjVar(objectRow.object_id, objectRow.objvar_18_name, objectRow.objvar_18_value);
checkObjVar(objectRow.object_id, objectRow.objvar_19_name, objectRow.objvar_19_value);
end loop;
end;
procedure testObjvars
as
begin
setupData;
for objvarRow in (select distinct object_id, co.deprecated
from object_variables ov, cnvtest_objvars co
where ov.name_id = co.id
and (co.deprecated = 1
or case when translate(ov.value, 'a0123456789','a') is not null then null else to_number(ov.value) end < co.min_value
or case when translate(ov.value, 'a0123456789','a') is not null then null else to_number(ov.value) end > co.max_value))
loop
if (objvarRow.deprecated = 1) then
registerError(objvarRow.object_id, 'has deprecated objvars (object variables table)');
else
registerError(objvarRow.object_id, 'has objvars out of range (object variables table)');
end if;
end loop;
end;
procedure testScripts
as
begin
setupData;
for scriptRow in (select distinct object_id
from scripts s, cnvtest_removed_scripts r
where s.script=r.name)
loop
registerError(scriptRow.object_id, 'has deprecated scripts (scripts table)');
end loop;
end;
procedure testAll
as
begin
testObjvars;
commit;
testObjects;
commit;
testScripts;
commit;
end;
procedure setupData
as
begin
if isInitialized = false then
dbms_output.enable(20000);
delete cnvtest_objvars;
insert into cnvtest_objvars
select name, id, deprecated, min_value, max_value
from object_variable_names ovn, cnvtest_objvar_patterns cop
where ovn.name like cop.name_pattern
and ovn.name not in (
'crafting_components.armor_armorencumbrance',
'crafting_components.armor_condition',
'crafting_components.armor_general_protection',
'crafting_components.armor_layer0',
'crafting_components.armor_layer1',
'crafting_components.armor_layer12',
'crafting_components.armor_layer2',
'crafting_components.armor_layer4',
'crafting_components.armor_layer5',
'crafting_components.armor_layer7'
);
commit;
objvars.delete;
for objvarRow in (select * from cnvtest_objvars)
loop
objvars(objvarRow.name) := objvarRow;
end loop;
select * bulk collect into removedScripts from cnvtest_removed_scripts;
if (removedScripts.count <> 0) then
for i in removedScripts.first .. removedScripts.last
loop
removedScripts(i) := '%' || removedScripts(i) || ':%';
end loop;
end if;
numErrors := 0;
execute immediate 'analyze table cnvtest_objvars compute statistics';
execute immediate 'analyze table cnvtest_removed_scripts compute statistics';
end if;
end;
procedure checkObjVar (object_id number, name varchar2, value varchar2)
as
begin
if (objvars.exists(name)) then
if (objvars(name).deprecated = 1) then
registerError(object_id, 'has deprecated objvars (objects table)');
else
if (value < objvars(name).min_value or value > objvars(name).max_value) then
registerError(object_id, 'has objvars out of range (objects table)');
end if;
end if;
end if;
exception when others then
registerError(object_id, 'has objvars that were expected to be numeric but were not (objects table)');
end;
procedure registerError (p_object_id number, p_description varchar2)
as
templateId number;
begin
select object_template_id into templateId from objects where object_id = p_object_id;
registerErrorWithTemplateId (p_object_id, templateId, p_description);
exception when no_data_found then
registerErrorWithTemplateId (p_object_id, 0, p_description || ', not found in objects table');
end;
procedure registerErrorWithTemplateId (p_object_id number, p_template_id number, p_description varchar2)
as
templateName varchar2(255);
previousMessage varchar2(500);
l_description varchar2(500);
begin
l_description := p_description;
if (p_template_id <> 0) then
begin
select name into templateName from object_templates where id = p_template_id;
exception when no_data_found then
templateName := p_template_id;
l_description := l_description || ', object template id not found in object_templates';
end;
else
templateName := 'none';
end if;
insert into cnvtest_errors
values (p_object_id, templateName, l_description);
numErrors := numErrors + 1;
if (maxErrors<>0 and numErrors >= maxErrors) then
commit;
raise_application_error(-20000,'Too many errors found');
end if;
exception when dup_val_on_index then
update cnvtest_errors set error_description = error_description || ', ' || l_description
where cnvtest_errors.object_id=p_object_id;
end;
end;
/
show errors