Files
2026-08-13 18:33:10 +02:00

507 lines
21 KiB
Python
Executable File

#!/usr/bin/python
import csv
import os
import getopt
import sys
class sql_generator(object):
def __init__( self ):
self.project = None
self.subdir = None
self.ins_gear_type = list()
self.ins_charge_type = list()
self.upd_charge_type = list()
self.ins_gear_type_charge_type = list()
self.ins_igniter_type = list()
self.ins_igniter_function = list()
self.ins_charge_type_igniter_type_igniter_function = list()
self.ins_load_type = list()
self.ins_charge_type_load_type = list()
self.ins_building_charge_effect = list()
self.ins_can_component_string = list()
self.ins_bite_component_text = list()
self.ins_pdm_equipment_system_event_filter = list()
self.ins_pdm_event_filter_hgr_mine_search = list()
self.ins_radio_group = list()
self.ins_fire_purpose = list()
self.ins_target_type = list()
self.ins_target_subtype = list()
self.ins_target_type_target_subtype = list()
self.ins_nuclear_preset = list()
self.ins_vulnerability_kind = list()
self.ins_translation = list()
self.csv_header = None
self.translation_header = []
self.translation_lang = []
self.default_header = []
self.default_language = 'de_DE'
def initialize(self):
if self.project == None:
print >> sys.stderr, "No project given"
sys.exit(1)
def execute(self):
self.subdir = self.project+'_pdm'
print >> sys.stderr, "Looking into dir %s" % self.subdir
print '\nDo not forget to convert the files from CP850 to UTF-8!\n'
print 'for f in `ls -1 *csv`; do iconv -f cp850 -t utf-8 -o $f.out $f; mv $f.out $f; done'
print 'or'
print 'for f in `ls -1 *csv`; do iconv -f iso8859-1 -t utf-8 -o $f.out $f; mv $f.out $f; done\n\n'
print 'depending on the used excel version / export settings'
self.read_csv('charge_type.csv', self.charge_type);
self.read_csv('gear_type.csv', self.gear_type);
self.read_csv('igniter_type.csv', self.igniter_type);
self.read_csv('igniter_function.csv', self.igniter_function);
self.read_csv('charge_type_igniter_type_igniter_function.csv', self.charge_type_igniter_type_igniter_function);
self.read_csv('load_type.csv', self.load_type);
self.read_csv('charge_type_load_type.csv', self.charge_type_load_type);
self.read_csv('building_charge_effect.csv', self.building_charge_effect);
self.read_csv('can_component_string.csv', self.can_component_string);
self.read_csv('bite_component_text.csv', self.bite_component_text);
self.read_csv('event_filter_hgr_mine_search.csv', self.event_filter_hgr_mine_search);
self.read_csv('equipment_system_event_filter.csv', self.equipment_system_event_filter);
self.read_csv('radio_group.csv', self.radio_group);
self.read_csv('fire_purpose.csv', self.fire_purpose);
self.read_csv('target_type.csv', self.target_type);
self.read_csv('target_subtype.csv', self.target_subtype);
self.read_csv('target_type_target_subtype.csv', self.target_type_target_subtype);
self.read_csv('nuclear_preset.csv', self.nuclear_preset);
self.read_csv('vulnerability_kind.csv', self.vulnerability_kind);
# self.read_csv('type_class.csv', self.vulnerability_kind);
# self.read_csv('gear_class.csv', self.vulnerability_kind);
f = open(self.project + '_pdm_values.sql', 'wt')
head = """-- # $Id$
-- # $HeadURL$
-- # $Author$"""
f.write(head)
warning = '\n\n--- This file is automatically generated by pdm_csv_to_sql.py from csv (xls) files - do not modify here directly!'
f.write(warning)
f.write('\nBEGIN;\n-- pdm_gear_type\n')
f.write('\n'.join(str(e) for e in self.ins_gear_type))
f.write(warning)
f.write('\n\n-- charge_type\n')
f.write('\n'.join(str(e) for e in self.ins_charge_type))
f.write(warning)
f.write('\n\n-- gear_type_charge_type\n')
f.write('\n'.join(str(e) for e in self.ins_gear_type_charge_type))
f.write(warning)
f.write('\n\n-- igniter_type\n')
f.write('\n'.join(str(e) for e in self.ins_igniter_type))
f.write(warning)
f.write('\n\n-- igniter_function\n')
f.write('\n'.join(str(e) for e in self.ins_igniter_function))
f.write(warning)
f.write('\n\n-- charge_type_igniter_type_igniter_function\n')
f.write('\n'.join(str(e) for e in self.ins_charge_type_igniter_type_igniter_function))
f.write(warning)
f.write('\n\n-- load_type\n')
f.write('\n'.join(str(e) for e in self.ins_load_type))
f.write(warning)
f.write('\n\n-- charge_type_load_type\n')
f.write('\n'.join(str(e) for e in self.ins_charge_type_load_type))
f.write(warning)
f.write('\n\n-- building_charge_effect\n')
f.write('\n'.join(str(e) for e in self.ins_building_charge_effect))
f.write(warning)
f.write('\n\n-- can_component_string\n')
f.write('\n'.join(str(e) for e in self.ins_can_component_string))
f.write(warning)
f.write('\n\n-- bite_component_text\n')
f.write('\n'.join(str(e) for e in self.ins_bite_component_text))
f.write(warning)
f.write('\n\n-- pdm_equipment_system_event_filter\n')
f.write('\n'.join(str(e) for e in self.ins_pdm_equipment_system_event_filter))
f.write(warning)
f.write('\n\n-- pdm_event_filter_hgr_mine_search\n')
f.write('\n'.join(str(e) for e in self.ins_pdm_event_filter_hgr_mine_search))
f.write(warning)
f.write('\n\n-- radio_group\n')
f.write('\n'.join(str(e) for e in self.ins_radio_group))
f.write(warning)
f.write('\n\n-- fire_purpose\n')
f.write('\n'.join(str(e) for e in self.ins_fire_purpose))
f.write(warning)
f.write('\n\n-- target_type\n')
f.write('\n'.join(str(e) for e in self.ins_target_type))
f.write(warning)
f.write('\n\n-- target_subtype\n')
f.write('\n'.join(str(e) for e in self.ins_target_subtype))
f.write(warning)
f.write('\n\n-- targe_type_target_subtype\n')
f.write('\n'.join(str(e) for e in self.ins_target_type_target_subtype))
f.write(warning)
f.write('\n\n-- nuclear_preset\n')
f.write('\n'.join(str(e) for e in self.ins_nuclear_preset))
f.write(warning)
f.write('\n\n-- vulnerability_kind\n')
f.write('\n'.join(str(e) for e in self.ins_vulnerability_kind))
f.write(warning)
f.write('\n\n-- translation\n')
f.write('\n'.join(str(e) for e in self.ins_translation))
f.write('\nCOMMIT;\n-- END\n')
f2 = open(self.project + '_pdm_charge_type_update.sql', 'wt')
f2.write(head)
f2.write(warning)
f2.write('\nBEGIN;\n-- charge_type (update)\n')
f2.write('\n'.join(str(e) for e in self.upd_charge_type))
f2.write(warning)
f2.write('\nCOMMIT;\n-- END\n')
def read_csv(self, filename, func):
print 'parsing %s' % filename
reader = csv.reader(open(os.path.join(self.subdir, filename), 'rt'), delimiter = ';')
self.parseHeader(reader)
for a in reader:
func(a)
def parseHeader(self, reader):
self.translation_header = []
self.default_header = []
self.csv_header = next(reader, None)
for i in range(0, len(self.csv_header)):
h = self.csv_header[i]
if '[' in h and h.endswith(']'):
lang = h[h.index('[') + 1:-1]
if lang == self.default_language:
self.default_header.append(i)
else:
self.translation_header.append(i)
self.translation_lang.append(lang)
def toBool(self, val):
if val == '':
return 'false'
if val == 'true' or val == '1':
return 'true'
if val == 'false' or val == '0':
return 'false'
if bool(val):
return 'true'
return 'false'
def toInt(self, val):
if val == '':
return 'NULL'
return int(val, 0)
def toFloat(self, val):
val = val.replace(',', '.')
if val == '':
return 0
return float(val)
def toString(self, val):
if val == '':
return 'NULL'
return "'" + val + "'"
def toJson(self, val):
return self.toString(val) # for now
def create_translation(self, array_idx, line, context, disambiguation):
iso_code = self.translation_lang[array_idx]
key = line[self.default_header[array_idx]]
i18n = line[self.translation_header[array_idx]]
if len(i18n) == 0:
return
self.ins_translation.append("INSERT INTO pdm.pdm_translation (iso_code, disambiguation, context, key, translation) VALUES (%s, %s, %s, %s, %s);" % (self.toString(iso_code), self.toString(disambiguation), self.toString(context), self.toString(key), self.toString(i18n)))
def gear_type(self, line):
if len(line[0]) == 0:
return
# id;tas_code;name [de_DE];name [en_GB];gear_class_id
id = self.toInt(line[0])
self.ins_gear_type.append("INSERT INTO pdm.pdm_gear_type (id, tas_code, name, gear_class_id, properties) VALUES (%s, %s, %s, %s, %s);" % (id, self.toInt(line[1]), self.toString(line[2]), self.toInt(line[4]), self.toString(line[5])))
self.create_translation(0, line, 'GearType', 'name')
def charge_type(self, line):
if len(line[0]) == 0:
return
# 0- 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14
# id,legacy_id,given_name,name [de_DE],shortName [de_DE],name [en_GB],shortName [en_GB],properties,gear_type,max_range,properties,gear_type,max_range,properties,dis_code
id = self.toInt(line[0])
legacy_id = self.toInt(line[1])
predefined_name = self.toString(line[2])
name = self.toString(line[3])
short_name = self.toString(line[4])
props = self.toJson(line[7])
dis_entity = self.toJson(line[14]) if len(line) > 14 else 'NULL';
properties_1 = self.toJson(line[10])
properties_2 = self.toJson(line[13])
self.ins_charge_type.append("INSERT INTO pdm.pdm_charge_type (id, predefined_name, name, short_name, properties, dis_entity, charge_legacy_id) VALUES (%s, %s, %s, %s, %s, %s, %s);" % (id, predefined_name, name, short_name, props, dis_entity, legacy_id))
self.upd_charge_type.append("UPDATE pdm.pdm_charge_type SET predefined_name = %s, name = %s, short_name = %s, properties = %s, dis_entity = %s, charge_legacy_id = %s WHERE ID = %s;" % (predefined_name, name, short_name, props, dis_entity, legacy_id, id))
for i in (8,11):
if i >= len(line): break
gt = line[i]
if gt == '': continue
range = ''
if i + 1 < len(line):
range = line[i+1]
if properties_1 == "NULL":
self.ins_gear_type_charge_type.append("INSERT INTO pdm.pdm_gear_type_charge_type (gear_type_id, charge_type_id, max_range) VALUES (%s, %s, %s);" % (gt, id, self.toInt(range)))
else:
self.ins_gear_type_charge_type.append("INSERT INTO pdm.pdm_gear_type_charge_type (gear_type_id, charge_type_id, max_range, properties) VALUES (%s, %s, %s, %s);" % (gt, id, self.toInt(range), properties_1))
self.create_translation(0, line, 'ChargeType', 'name')
self.create_translation(1, line, 'ChargeType', 'shortName')
def igniter_type(self, line):
if len(line[0]) == 0:
return
# id;name [de_DE];shortName [de_DE],name [en_GB];shortName [en_GB];properties
id = self.toInt(line[0])
name = self.toString(line[1])
short_name = self.toString(line[2])
props = self.toJson(line[5])
self.ins_igniter_type.append("INSERT INTO pdm.pdm_igniter_type (id, name, short_name, properties) VALUES (%s, %s, %s, %s);" % (id, name, short_name, props))
self.create_translation(0, line, 'IngiterType', 'name')
self.create_translation(1, line, 'IgniterType', 'shortName')
def igniter_function(self, line):
if len(line[0]) == 0:
return
# id;name [de_DE];shortName [de_DE],name [en_GB];shortName [en_GB];properties
id = self.toInt(line[0])
name = self.toString(line[1])
short_name = self.toString(line[2])
props = self.toJson(line[5])
self.ins_igniter_function.append("INSERT INTO pdm.pdm_igniter_function (id, name, short_name, properties) VALUES (%s, %s, %s, %s);" % (id, name, short_name, props))
self.create_translation(0, line, 'IngiterFunction', 'name')
self.create_translation(1, line, 'IgniterFunction', 'shortName')
def charge_type_igniter_type_igniter_function(self, line):
if len(line[0]) == 0:
return
# charge_type_id;igniter_type_id;igniter_function_id;impact_area,impact_radius;hazard_distance;charge_legacy_id;igniter_function_base_id;properties
charge_type_id = self.toInt(line[0])
igniter_type_id = self.toInt(line[1])
igniter_function_id = self.toInt(line[2])
impact_area = self.toJson(line[3])
impact_radius = self.toInt(line[4])
hazard_distance = self.toInt(line[5])
charge_legacy_id = self.toInt(line[6])
igniter_function_base_id = self.toInt(line[7])
props = self.toJson(line[8])
self.ins_charge_type_igniter_type_igniter_function.append("INSERT INTO pdm.pdm_charge_type_igniter_type_igniter_function (charge_type_id, igniter_type_id, igniter_function_id, impact_area, impact_radius, hazard_distance, charge_legacy_id, igniter_function_base_id, properties) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s);" % (charge_type_id, igniter_type_id, igniter_function_id, impact_area, impact_radius, hazard_distance, charge_legacy_id, igniter_function_base_id, props))
def load_type(self, line):
if len(line[0]) == 0:
return
# id;name [de_DE];shortName [de_DE],name [en_GB];shortName [en_GB];properties
id = self.toInt(line[0])
name = self.toString(line[1])
short_name = self.toString(line[2])
props = self.toJson(line[5])
self.ins_load_type.append("INSERT INTO pdm.pdm_load_type (id, name, short_name, properties) VALUES (%s, %s, %s, %s);" % (id, name, short_name, props))
self.create_translation(0, line, 'LoadType', 'name')
self.create_translation(1, line, 'LoadType', 'shortName')
def charge_type_load_type(self, line):
if len(line[0]) == 0:
return
# charge_type_id;load_type_id;numbers;properties
charge_type_id = self.toInt(line[0])
load_type_id = self.toInt(line[1])
numbers = self.toString(line[2])
props = self.toJson(line[3])
self.ins_charge_type_load_type.append("INSERT INTO pdm.pdm_charge_type_load_type (charge_type_id, load_type_id, numbers, properties) VALUES (%s, %s, %s, %s);" % (charge_type_id, load_type_id, numbers, props))
def building_charge_effect(self, line):
if len(line[0]) == 0:
return
# id, charge_type_id;destructive_factor;penetration_factor;hit_sound;difcue_light;difcue_pyro
ky = self.toInt(line[0])
ct = self.toInt(line[1])
df = self.toInt(line[2])
pf = self.toInt(line[3])
hs = self.toInt(line[4])
dl = self.toBool(line[5])
dp = self.toBool(line[6])
self.ins_building_charge_effect.append("INSERT INTO pdm.pdm_building_charge_effect (id, charge_type_id, destructive_factor, penetration_factor, hit_sound, difcue_light, difcue_pyro) VALUES (%s, %s, %s, %s, %s, %s, %s);" % (ky, ct, df, pf, hs, dl, dp))
def can_component_string(self, line):
if len(line[0]) == 0:
return
# name [de_DE], name [en_GB], bit_mask, can_device_id, sub_device_id
name = self.toString(line[0])
bm = self.toInt(line[2])
cd = self.toInt(line[3])
sd = self.toInt(line[4])
self.ins_can_component_string.append("INSERT INTO pdm.pdm_can_component_string (name, bit_mask, can_device_id, sub_device_id) VALUES (%s, %s, %s, %s);" % (name, bm, cd, sd))
self.create_translation(0, line, 'CanComponentString', 'name')
def bite_component_text(self, line):
if len(line[0]) == 0:
return
# can_device_id, sub_device_id, error_number, name
name = self.toString(line[0])
cd = self.toInt(line[2])
sd = self.toInt(line[3])
er = self.toInt(line[4])
self.ins_bite_component_text.append("INSERT INTO pdm.pdm_bite_component_text (name, can_device_id, sub_device_id, error_number) VALUES (%s, %s, %s, %s);" % (name, cd, sd, er))
self.create_translation(0, line, 'BiteComponentText', 'name')
def equipment_system_event_filter(self, line):
if len(line[0]) == 0:
return
# equipment_functional_id, sub_device_id, device_specific_code, hgr_mine_search_filter_type_id
ef = self.toInt(line[0])
sd = self.toInt(line[1])
dsc = self.toInt(line[2])
hgr = self.toInt(line[3])
self.ins_pdm_equipment_system_event_filter.append("INSERT INTO pdm.pdm_equipment_system_event_filter (equipment_functional_id, sub_device_id, device_specific_code, hgr_mine_search_filter_type_id) VALUES (%s, %s, %s, %s);" % (ef, sd, dsc, hgr))
def event_filter_hgr_mine_search(self, line):
if len(line[0]) == 0:
return
# hgr_mine_search_filter_type_idm, charge_type_id
hgr = self.toInt(line[0])
ct = self.toInt(line[1])
self.ins_pdm_event_filter_hgr_mine_search.append("INSERT INTO pdm.pdm_event_filter_hgr_mine_search (hgr_mine_search_filter_type_id, charge_type_id) VALUES (%s, %s);" % (hgr, ct))
def radio_group(self, line):
if len(line[0]) == 0:
return
txt = (self.toInt(line[0]), self.toString(line[1]), self.toBool(line[2]), self.toInt(line[3]), self.toInt(line[4]), self.toInt(line[5]), self.toString(line[6]), self.toInt(line[7]), self.toString(line[8]), self.toInt(line[9]))
if len(line) > 10:
self.create_translation(0, line, 'RadioGroup', 'name')
# id, name[def], base_group, issi, group_issi1, group_issi2, radio_hostname, radio_port, radio_backup_hostname, radio_backup_port, name[en_GB] (optional)
self.ins_radio_group.append("INSERT INTO pdm.pdm_radio_group (id, name, base_group, issi, group_issi1, group_issi2, radio_hostname, radio_port, radio_backup_hostname, radio_backup_port) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s);" % txt);
def fire_purpose(self, line):
if len(line[0]) == 0:
return
# id, name [de_DE], name [en_GB], Description, properties
id = self.toInt(line[0])
name = self.toString(line[1])
props = self.toJson(line[4])
txt = (id, name, props)
self.ins_fire_purpose.append("INSERT INTO pdm.pdm_fire_purpose (id, name, properties) VALUES (%s, %s, %s);" % txt)
self.create_translation(0, line, 'FirePurpose', 'name')
def target_type(self, line):
if len(line[0]) == 0:
return
# id, name [de_DE], name [en_GB], abbreviation
id = self.toInt(line[0])
name = self.toString(line[1])
abbr = self.toString(line[3])
props = self.toJson(line[4])
txt = (id, name, abbr, props)
self.ins_target_type.append("INSERT INTO pdm.pdm_target_type (id, name, abbreviation, properties) VALUES (%s, %s, %s, %s);" % txt)
self.create_translation(0, line, 'TargetType', 'name')
def target_subtype(self, line):
if len(line[0]) == 0:
return
# id, name [de_DE], name [en_GB], abbreviation
id = self.toInt(line[0])
name = self.toString(line[1])
abbr = self.toString(line[3])
props = self.toJson(line[4])
txt = (id, name, abbr, props)
self.ins_target_subtype.append("INSERT INTO pdm.pdm_target_subtype (id, name, abbreviation, properties) VALUES (%s, %s, %s, %s);" % txt)
self.create_translation(0, line, 'TargetSubType', 'name')
def target_type_target_subtype(self, line):
if len(line[0]) == 0:
return
# target_type_id;target_subtype_id
targetTypeId = self.toInt(line[0])
targetSubtypeId = self.toString(line[1])
props = self.toJson(line[2])
txt = (targetTypeId, targetSubtypeId, props)
self.ins_target_type_target_subtype.append("INSERT INTO pdm.pdm_target_type_target_subtype (target_type_id, target_subtype_id, properties) VALUES (%s, %s, %s);" % txt)
def nuclear_preset(self, line):
if len(line[0]) == 0:
return
# id name [de_DE] name [en_GB] detonation_value impact_radius border_length_inner border_length_outer
id = self.toInt(line[0])
name = self.toString(line[1])
det = self.toFloat(line[3])
imp = self.toInt(line[4])
bli = self.toInt(line[5])
blo = self.toInt(line[6])
txt = (id, name, det, imp, bli, blo)
self.ins_nuclear_preset.append("INSERT INTO pdm.pdm_nuclear_preset (id, name, detonation_value, impact_radius, border_length_inner, border_length_outer) VALUES (%s, %s, %s, %s, %s, %s);" % txt)
self.create_translation(0, line, 'NuclearPreset', 'name')
def vulnerability_kind(self, line):
if len(line[0]) == 0:
return
# player_type_class_id;ta_vulnerability_kind;vulnerability_class_id;name [de_DE];name [en_GB];Teilnehmer-Name;Teilnehmer-Typ;Index;Fallback
id = self.toInt(line[0])
kind = self.toInt(line[1])
cls = self.toInt(line[2])
name = self.toString(line[3])
txt = (id, kind, cls, name)
self.ins_vulnerability_kind.append("INSERT INTO pdm.pdm_vulnerability_kind (player_type_class_id, ta_vulnerability_kind, vulnerability_class_id, name) VALUES (%s, %s, %s, %s);" % txt)
self.create_translation(0, line, 'VulnerabilityKind', 'name')
def usage():
print "Usage: %s <Options>" % sys.argv[0]
print "usage: $0 -p <project>"
print " -p (--project) : guez / ahtc "
def main():
p = sql_generator()
try:
opts, args = getopt.getopt(sys.argv[1:], "p:", ["project"])
except getopt.GetoptError, err:
print >> sys.stderr, err
usage()
sys.exit(2)
for o, a in opts:
if o in ("-p", "--project"):
p.project = a
print >> sys.stderr, "PROJECT: %s" % a
p.initialize()
p.execute()
sys.exit(0)
if __name__ == "__main__":
main()