- # rewrite a iso-8859-1 encoded file in utf8
- try:
- inputfile = open(inputfile_name, 'r')
- outputfile = open(outputfile_name, 'w')
- for line in inputfile:
- if line.upper().find('SET CLIENT_ENCODING') > -1:
- continue
- outputfile.write(str(line, 'iso-8859-1').encode('utf8'))
- inputfile.close()
- outputfile.close()
- except:
- print('error encoding file')
- raise
+ # rewrite a iso-8859-1 encoded file in utf8
+ try:
+ inputfile = open(inputfile_name, 'r')
+ outputfile = open(outputfile_name, 'w')
+ for line in inputfile:
+ if line.upper().find('SET CLIENT_ENCODING') > -1:
+ continue
+ outputfile.write(str(line, 'iso-8859-1').encode('utf8'))
+ inputfile.close()
+ outputfile.close()
+ except:
+ print('error encoding file')
+ raise
- if table_name in ['interfaces']:
- # convert str bwlimit to bps int
- bwlimit_index = table_fields.index('bwlimit')
- if isinstance(row[bwlimit_index], int):
- pass
- elif row[bwlimit_index].find('mbit') > -1:
- row[bwlimit_index] = int(row[bwlimit_index].split('mbit')[0]) \
- * 1000000
- elif row[bwlimit_index].find('kbit') > -1:
- row[bwlimit_index] = int(row[bwlimit_index].split('kbit')[0]) \
- * 1000
- elif table_name in ['slice_attribute']:
- # modify some invalid foreign keys
- attribute_type_index = table_fields.index('attribute_type_id')
- if row[attribute_type_index] == 10004:
- row[attribute_type_index] = 10016
- elif row[attribute_type_index] == 10006:
- row[attribute_type_index] = 10017
- elif row[attribute_type_index] in [10031, 10033]:
- row[attribute_type_index] = 10037
- elif row[attribute_type_index] in [10034, 10035]:
- row[attribute_type_index] = 10036
- elif table_name in ['slice_attribute_types']:
- type_id_index = table_fields.index('attribute_type_id')
- if row[type_id_index] in [10004, 10006, 10031, 10033, 10034, 10035]:
- return None
- return row
-
+ if table_name in ['interfaces']:
+ # convert str bwlimit to bps int
+ bwlimit_index = table_fields.index('bwlimit')
+ if isinstance(row[bwlimit_index], int):
+ pass
+ elif row[bwlimit_index].find('mbit') > -1:
+ row[bwlimit_index] = int(row[bwlimit_index].split('mbit')[0]) \
+ * 1000000
+ elif row[bwlimit_index].find('kbit') > -1:
+ row[bwlimit_index] = int(row[bwlimit_index].split('kbit')[0]) \
+ * 1000
+ elif table_name in ['slice_attribute']:
+ # modify some invalid foreign keys
+ attribute_type_index = table_fields.index('attribute_type_id')
+ if row[attribute_type_index] == 10004:
+ row[attribute_type_index] = 10016
+ elif row[attribute_type_index] == 10006:
+ row[attribute_type_index] = 10017
+ elif row[attribute_type_index] in [10031, 10033]:
+ row[attribute_type_index] = 10037
+ elif row[attribute_type_index] in [10034, 10035]:
+ row[attribute_type_index] = 10036
+ elif table_name in ['slice_attribute_types']:
+ type_id_index = table_fields.index('attribute_type_id')
+ if row[type_id_index] in [10004, 10006, 10031, 10033, 10034, 10035]:
+ return None
+ return row
+
- if field_parts[2:]:
- joins.update(set([x for x in field_parts[2:] if not x.find('=') > -1]))
- wheres.update(set([x for x in field_parts[2:] if x.find('=') > -1]))
-
- # get indices of fields that cannot be null
- (type, body_list) = schema[table_name]
- not_null_indices = []
- for field in table_fields:
- for body_line in body_list:
- if body_line.find(field) > -1 and \
- body_line.upper().find("NOT NULL") > -1:
- not_null_indices.append(table_fields.index(field))
- # get index of primary key
- primary_key_indices = []
- for body_line in body_list:
- if body_line.find("PRIMARY KEY") > -1:
- primary_key = body_line
- for field in table_fields:
- if primary_key.find(" "+field+" ") > -1:
- primary_key_indices.append(table_fields.index(field))
- #break
-
+ if field_parts[2:]:
+ joins.update(set([x for x in field_parts[2:] if not x.find('=') > -1]))
+ wheres.update(set([x for x in field_parts[2:] if x.find('=') > -1]))
+
+ # get indices of fields that cannot be null
+ (type, body_list) = schema[table_name]
+ not_null_indices = []
+ for field in table_fields:
+ for body_line in body_list:
+ if body_line.find(field) > -1 and \
+ body_line.upper().find("NOT NULL") > -1:
+ not_null_indices.append(table_fields.index(field))
+ # get index of primary key
+ primary_key_indices = []
+ for body_line in body_list:
+ if body_line.find("PRIMARY KEY") > -1:
+ primary_key = body_line
+ for field in table_fields:
+ if primary_key.find(" "+field+" ") > -1:
+ primary_key_indices.append(table_fields.index(field))
+ #break
+
- # escape whatever can mess up the data format
- if isinstance(row[i], str):
- row[i] = row[i].replace('\t', '\\t')
- row[i] = row[i].replace('\n', '\\n')
- row[i] = row[i].replace('\r', '\\r')
- data_row = "\t".join(row)
- temp_file.write(data_row + "\n")
+ # escape whatever can mess up the data format
+ if isinstance(row[i], str):
+ row[i] = row[i].replace('\t', '\\t')
+ row[i] = row[i].replace('\n', '\\n')
+ row[i] = row[i].replace('\r', '\\r')
+ data_row = "\t".join(row)
+ temp_file.write(data_row + "\n")
- cursor.execute("SELECT relname from pg_class where relname = 'plc_db_version'")
- rows = cursor.fetchall()
- if not rows:
- print("Warning: current db has no version. Unable to validate config file.")
- else:
- cursor.execute("SELECT version FROM plc_db_version")
- rows = cursor.fetchall()
- if not rows or not rows[0]:
- print("Warning: current db has no version. Unable to validate config file.")
- elif rows[0][0] == db_version_new:
- print("Status: Versions are the same. No upgrade necessary.")
- sys.exit()
- elif not rows[0][0] == db_version_previous:
- print("Stauts: DB_VERSION_PREVIOUS in config file (%s) does not" \
- " match current db version %d" % (upgrade_config_file, rows[0][0]))
- sys.exit()
- else:
- print("STATUS: attempting upgrade from %d to %d" % \
- (db_version_previous, db_version_new))
-
- # check db encoding
- sql = " SELECT pg_catalog.pg_encoding_to_char(d.encoding)" \
- " FROM pg_catalog.pg_database d " \
- " WHERE d.datname = '%s' " % config['PLC_DB_NAME']
- cursor.execute(sql)
- rows = cursor.fetchall()
- if rows[0][0] not in ['UTF8', 'UNICODE']:
- print("WARNING: db encoding is not utf8. Attempting to encode")
- db.close()
- # generate db dump
- dump_file = '%s/dump.sql' % (temp_dir)
- dump_file_encoded = dump_file + ".utf8"
- dump_cmd = 'pg_dump -i %s -U postgres -f %s > /dev/null 2>&1' % \
- (config['PLC_DB_NAME'], dump_file)
- if os.system(dump_cmd):
- print("ERROR: during db dump. Exiting.")
- sys.exit(1)
- # encode dump to utf8
- print("Status: encoding database dump")
- encode_utf8(dump_file, dump_file_encoded)
- # archive original db
- archive_db(config['PLC_DB_NAME'], config['PLC_DB_NAME']+'_sqlascii_archived')
- # create a utf8 database and upload encoded data
- recreate_cmd = 'createdb -U postgres -E UTF8 %s > /dev/null; ' \
- 'psql -a -U %s %s < %s > /dev/null 2>&1;' % \
- (config['PLC_DB_NAME'], config['PLC_DB_USER'], \
- config['PLC_DB_NAME'], dump_file_encoded)
- print("Status: recreating database as utf8")
- if os.system(recreate_cmd):
- print("Error: database encoding failed. Aborting")
- sys.exit(1)
-
- os.remove(dump_file_encoded)
- os.remove(dump_file)
+ cursor.execute("SELECT relname from pg_class where relname = 'plc_db_version'")
+ rows = cursor.fetchall()
+ if not rows:
+ print("Warning: current db has no version. Unable to validate config file.")
+ else:
+ cursor.execute("SELECT version FROM plc_db_version")
+ rows = cursor.fetchall()
+ if not rows or not rows[0]:
+ print("Warning: current db has no version. Unable to validate config file.")
+ elif rows[0][0] == db_version_new:
+ print("Status: Versions are the same. No upgrade necessary.")
+ sys.exit()
+ elif not rows[0][0] == db_version_previous:
+ print("Stauts: DB_VERSION_PREVIOUS in config file (%s) does not" \
+ " match current db version %d" % (upgrade_config_file, rows[0][0]))
+ sys.exit()
+ else:
+ print("STATUS: attempting upgrade from %d to %d" % \
+ (db_version_previous, db_version_new))
+
+ # check db encoding
+ sql = " SELECT pg_catalog.pg_encoding_to_char(d.encoding)" \
+ " FROM pg_catalog.pg_database d " \
+ " WHERE d.datname = '%s' " % config['PLC_DB_NAME']
+ cursor.execute(sql)
+ rows = cursor.fetchall()
+ if rows[0][0] not in ['UTF8', 'UNICODE']:
+ print("WARNING: db encoding is not utf8. Attempting to encode")
+ db.close()
+ # generate db dump
+ dump_file = '%s/dump.sql' % (temp_dir)
+ dump_file_encoded = dump_file + ".utf8"
+ dump_cmd = 'pg_dump -i %s -U postgres -f %s > /dev/null 2>&1' % \
+ (config['PLC_DB_NAME'], dump_file)
+ if os.system(dump_cmd):
+ print("ERROR: during db dump. Exiting.")
+ sys.exit(1)
+ # encode dump to utf8
+ print("Status: encoding database dump")
+ encode_utf8(dump_file, dump_file_encoded)
+ # archive original db
+ archive_db(config['PLC_DB_NAME'], config['PLC_DB_NAME']+'_sqlascii_archived')
+ # create a utf8 database and upload encoded data
+ recreate_cmd = 'createdb -U postgres -E UTF8 %s > /dev/null; ' \
+ 'psql -a -U %s %s < %s > /dev/null 2>&1;' % \
+ (config['PLC_DB_NAME'], config['PLC_DB_USER'], \
+ config['PLC_DB_NAME'], dump_file_encoded)
+ print("Status: recreating database as utf8")
+ if os.system(recreate_cmd):
+ print("Error: database encoding failed. Aborting")
+ sys.exit(1)
+
+ os.remove(dump_file_encoded)
+ os.remove(dump_file)
- # find all created objects
- if line.startswith("CREATE"):
- line_parts = line.split(" ")
- if line_parts[1:3] == ['OR', 'REPLACE']:
- line_parts = line_parts[2:]
- item_type = line_parts[1]
- item_name = line_parts[2]
- schema_items_ordered.append(item_name)
- if item_type in ['INDEX']:
- schema[item_name] = (item_type, line)
-
- # functions, tables, views span over multiple lines
- # handle differently than indexes
- elif item_type in ['AGGREGATE', 'TABLE', 'VIEW']:
- fields = [line]
- while index < len(lines):
- index = index + 1
- nextline =lines[index]
- if nextline.find("--") > -1:
+ # find all created objects
+ if line.startswith("CREATE"):
+ line_parts = line.split(" ")
+ if line_parts[1:3] == ['OR', 'REPLACE']:
+ line_parts = line_parts[2:]
+ item_type = line_parts[1]
+ item_name = line_parts[2]
+ schema_items_ordered.append(item_name)
+ if item_type in ['INDEX']:
+ schema[item_name] = (item_type, line)
+
+ # functions, tables, views span over multiple lines
+ # handle differently than indexes
+ elif item_type in ['AGGREGATE', 'TABLE', 'VIEW']:
+ fields = [line]
+ while index < len(lines):
+ index = index + 1
+ nextline =lines[index]
+ if nextline.find("--") > -1:
- # look for any sequences
- if item_type in ['TABLE'] and nextline.find('serial') > -1:
- sequences[item_name] = nextline.strip().split()[0]
- fields.append(nextline)
- if nextline.find(";") >= 0:
- break
- schema[item_name] = (item_type, fields)
- else:
- print("Error: unknown type %s" % item_type)
- elif line.startswith("INSERT"):
- inserts.append(line)
- index = index + 1
-
+ # look for any sequences
+ if item_type in ['TABLE'] and nextline.find('serial') > -1:
+ sequences[item_name] = nextline.strip().split()[0]
+ fields.append(nextline)
+ if nextline.find(";") >= 0:
+ break
+ schema[item_name] = (item_type, fields)
+ else:
+ print("Error: unknown type %s" % item_type)
+ elif line.startswith("INSERT"):
+ inserts.append(line)
+ index = index + 1
+
- for key in schema_items_ordered:
- (type, body_list) = schema[key]
- create_item_from_schema(key)
- if type == 'TABLE':
- if key in upgrade_config:
- # attempt to populate with temp table data
- table_def = upgrade_config[key].replace('(', '').replace(')', '').split(',')
- table_fields = [field.strip().split(':')[0] for field in table_def]
- insert_cmd = "psql %s %s -c " \
+ for key in schema_items_ordered:
+ (type, body_list) = schema[key]
+ create_item_from_schema(key)
+ if type == 'TABLE':
+ if key in upgrade_config:
+ # attempt to populate with temp table data
+ table_def = upgrade_config[key].replace('(', '').replace(')', '').split(',')
+ table_fields = [field.strip().split(':')[0] for field in table_def]
+ insert_cmd = "psql %s %s -c " \
- ", ".join(table_fields), temp_tables[key] )
- exit_status = os.system(insert_cmd)
- if exit_status:
- print("Error: upgrade %s failed" % key)
- sys.exit(1)
- # update the primary key sequence
- if key in sequences:
- sequence = key +"_"+ sequences[key] +"_seq"
- update_seq = "psql %s %s -c " \
- " \"select setval('%s', max(%s)) FROM %s;\" > /dev/null" % \
- (config['PLC_DB_NAME'], config['PLC_DB_USER'], sequence,
- sequences[key], key)
- exit_status = os.system(update_seq)
- if exit_status:
- print("Error: sequence %s update failed" % sequence)
- sys.exit(1)
- else:
- # check if there are any insert stmts in schema for this table
- print("Warning: %s has no temp data file. Unable to populate with old data" % key)
- for insert_stmt in inserts:
- if insert_stmt.find(key) > -1:
- insert_cmd = 'psql %s postgres -qc "%s;" > /dev/null 2>&1' % \
- (config['PLC_DB_NAME'], insert_stmt)
- os.system(insert_cmd)
+ ", ".join(table_fields), temp_tables[key] )
+ exit_status = os.system(insert_cmd)
+ if exit_status:
+ print("Error: upgrade %s failed" % key)
+ sys.exit(1)
+ # update the primary key sequence
+ if key in sequences:
+ sequence = key +"_"+ sequences[key] +"_seq"
+ update_seq = "psql %s %s -c " \
+ " \"select setval('%s', max(%s)) FROM %s;\" > /dev/null" % \
+ (config['PLC_DB_NAME'], config['PLC_DB_USER'], sequence,
+ sequences[key], key)
+ exit_status = os.system(update_seq)
+ if exit_status:
+ print("Error: sequence %s update failed" % sequence)
+ sys.exit(1)
+ else:
+ # check if there are any insert stmts in schema for this table
+ print("Warning: %s has no temp data file. Unable to populate with old data" % key)
+ for insert_stmt in inserts:
+ if insert_stmt.find(key) > -1:
+ insert_cmd = 'psql %s postgres -qc "%s;" > /dev/null 2>&1' % \
+ (config['PLC_DB_NAME'], insert_stmt)
+ os.system(insert_cmd)