From 3ba55f8758839a408e72435c15de50e1dda03ce0 Mon Sep 17 00:00:00 2001 From: Guillaume Raffy Date: Wed, 7 Feb 2018 08:43:05 +0000 Subject: [PATCH] Bug 1978 - trouver un moyen de rationaliser l'achat du r930 cper 2017 - refactoring : improved so that now PowerDiagram also uses the Inventory class instead of duplicating code. This will: 1. make the code easier to maintain when there is a change in the inventory database tables 2. make the code easier to adapt when we switch from a sql file to a mysql server --- PowerDiagram.py | 84 ++++++++++--------------------------------------- inventory.py | 6 ++-- 2 files changed, 20 insertions(+), 70 deletions(-) diff --git a/PowerDiagram.py b/PowerDiagram.py index 9cf8bc7..b1ed404 100644 --- a/PowerDiagram.py +++ b/PowerDiagram.py @@ -13,7 +13,8 @@ import os import re import sys import pygraphviz -from mysql2sqlite import mysql_to_sqlite +from inventory import Inventory +from SimpaDbUtil import SqlFile, SqlDatabaseReader def add_capacity_constraints(capacity1, capacity2): """ @@ -164,80 +165,29 @@ class PowerConfig(object): def __init__(self, simpa_db_sql_file_path): self.machines = {} self.connections = [] - self._parse_from_simpa_db_sql_file(simpa_db_sql_file_path) - def _parse_from_simpa_db_sql_file(self, simpa_db_sql_file_path): - - def get_table_attr( cur, table, key_name, key_value, attr_name ): - attr_value = None - cur.execute("SELECT "+attr_name+" FROM "+table+" WHERE "+key_name+"='"+key_value+"'") - rows = cur.fetchall() - if len(rows) > 0: - attr_value = rows[0][0] - return attr_value - - def machine_name_toMachine_spec_id( cur, machine_name ): - machine_spec_id = get_table_attr( cur, 'machines', 'name', machine_name, 'machine_spec_id' ) - return machine_spec_id - - def machine_spec_id_to_power_consumption( cur, machine_spec_id ): - power_consumption = get_table_attr( cur, 'machine_spec_to_power_consumption', 'machine_spec_id', machine_spec_id, 'power_consumption' ) - return power_consumption - - def get_plug_type_attr(cur, plug_type, attr_name): - # INSERT INTO `powerplug_type_desc` (`plug_type_id`, `genre`, `max_amps`) VALUES - # ('iec60309_blue_pne6h_32a_m', 'm', 32.0), - attr_value = get_table_attr( cur, 'powerplug_type_desc', 'plug_type_id', plug_type, attr_name ) - return attr_value - - def read_plug_capacity(cur, plug): - plug_capacity = None - machine_spec_id = machine_name_toMachine_spec_id(cur, plug.machine.name) - if machine_spec_id is not None: - # INSERT INTO `powerplug_desc` (`machine_spec_id`, `powerplug_id`, `plug_type`) VALUES - # ('atos_mpdu_2901382', 'i', 'iec60309_blue_pne6h_32a_m'), - cur.execute("SELECT plug_type FROM powerplug_desc WHERE machine_spec_id='%s' AND powerplug_id='%s'" % (machine_spec_id, plug.name)) - rows = cur.fetchall() - if len(rows) > 0: - plug_type = rows[0][0] - # print('plug_type : %s' % plug_type) - - plug_capacity = get_plug_type_attr(cur, plug_type, 'max_amps') - #if plug_capacity: - # print('plug_capacity : %f A' % plug_capacity) - # print("read_plug_capacity : plug capacity for plug.machine.name="+plug.machine.name+" plug="+str(plug)+" : "+ str(plug_capacity)+ "A") - return plug_capacity - - sqliteDbPath=':memory:' # sqlite-specific special name for a file stored in memory. We could use something like '/tmp/simpadb.sqlite' here but this would make parsing really slow (1 minute instead of 1s), unless either : - # - proper fix : group of INSERT statements are surrounded by BEGIN and COMMIT (see http://stackoverflow.com/questions/4719836/python-and-sqlite3-adding-thousands-of-rows) - # - the file is stored on a solid state disk - try: - os.remove(sqliteDbPath) - except: - pass - con = sqlite3.connect(sqliteDbPath) - f = open(simpa_db_sql_file_path, 'r') - sql = f.read() # watch out for built-in `str` - #print(sql) - cur = con.cursor() - #print(mysql_to_sqlite(sql)) - cur.executescript(mysql_to_sqlite(sql)) - - cur.execute("SELECT * FROM machine_to_power") - - rows = cur.fetchall() + sql_source = SqlFile(simpa_db_sql_file_path) + sql_reader = SqlDatabaseReader(sql_source) + inventory = Inventory(sql_reader) + self._parse_from_inventory(inventory) + + def _parse_from_inventory(self, inventory): + """ + :param Inventory inventory: + """ + + rows = inventory.query("SELECT * FROM machine_to_power") for row in rows: (to_plug_as_str, from_plug_as_str, powercordid)=row if to_plug_as_str != '': conn = self._add_connection(from_plug_as_str, to_plug_as_str) for plug in (conn.from_plug, conn.to_plug): - plug_capacity = read_plug_capacity(cur, plug) + plug_capacity = inventory.read_plug_capacity(plug) if plug_capacity is not None: plug.set_current_capacity_constraint(plug_capacity) - cur.execute("SELECT * FROM power_output_specs") - rows = cur.fetchall() + rows = inventory.query("SELECT * FROM power_output_specs") for row in rows: # print row @@ -255,9 +205,9 @@ class PowerConfig(object): # print(machine_name) - machine_spec_id = machine_name_toMachine_spec_id(cur, machine_name) + machine_spec_id = inventory.machine_name_to_machine_spec_id(machine_name) if machine_spec_id is not None: - power_consumption = machine_spec_id_to_power_consumption(cur, machine_spec_id) + power_consumption = inventory.machine_spec_id_to_power_consumption(machine_spec_id) if power_consumption is not None: machine.power_consumption = power_consumption diff --git a/inventory.py b/inventory.py index 0b831b6..22021a1 100644 --- a/inventory.py +++ b/inventory.py @@ -18,7 +18,7 @@ class Inventory( object ): def query(self, sql_query): return self._sql_reader.query(sql_query) - def machine_name_toMachine_spec_id(self, machine_name ): + def machine_name_to_machine_spec_id(self, machine_name ): machine_spec_id = self._sql_reader.get_table_attr( 'machines', 'name', machine_name, 'machine_spec_id' ) return machine_spec_id @@ -36,7 +36,7 @@ class Inventory( object ): def read_plug_capacity(self, plug): plug_capacity = None - machine_spec_id = self.machine_name_toMachine_spec_id(plug.machine.name) + machine_spec_id = self.machine_name_to_machine_spec_id(plug.machine.name) if machine_spec_id is not None: # INSERT INTO `powerplug_desc` (`machine_spec_id`, `powerplug_id`, `plug_type`) VALUES # ('atos_mpdu_2901382', 'i', 'iec60309_blue_pne6h_32a_m'), @@ -45,7 +45,7 @@ class Inventory( object ): plug_type = rows[0][0] # print('plug_type : %s' % plug_type) - plug_capacity = get_plug_type_attr(plug_type, 'max_amps') + plug_capacity = self.get_plug_type_attr(plug_type, 'max_amps') #if plug_capacity: # print('plug_capacity : %f A' % plug_capacity) # print("read_plug_capacity : plug capacity for plug.machine.name="+plug.machine.name+" plug="+str(plug)+" : "+ str(plug_capacity)+ "A")