#!/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 " % sys.argv[0] print "usage: $0 -p " 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()