/// <summary> /// Monta a ordem de importação das tabelas de acordo com as foreign keys existentes no banco, /// tabelas referenciadas devem ser importadas antes das tabelas não referenciadas. /// Recebe como parâmetro uma lista de XMLs/dados, filtra apenas os pertencentes ao banco /// </summary> public static String[] SortImportFiles(SqlConnection sqlConnection, String databaseName, FileInfo[] dataFiles) { // Verifica quais arquivos de dados pertencem ao database List <String> databaseContents = new List <String>(); foreach (FileInfo dataFile in dataFiles) { ImportData importData = new ImportData(dataFile.FullName); if (importData.DatabaseName == databaseName) { databaseContents.Add(dataFile.FullName); } } // Empilha os arquivos de acordo com sua prioridade de importação Stack <String> fileStack = new Stack <String>(); List <String> filesLeft = new List <String>(); filesLeft.AddRange(databaseContents); List <Object> foreignKeys = GetForeignKeys(sqlConnection, databaseName); while (fileStack.Count != databaseContents.Count) { // Empilha as tabelas não referenciadas primeiro (fica embaixo na pilha), remove // as foreignkeys quebradas, repete o processo PushNotReferenced(fileStack, filesLeft, foreignKeys); RemoveBroken(foreignKeys, fileStack); } // Monta o array com os arquivos ordenados String[] orderedFiles = new String[databaseContents.Count]; int fileIndex = 0; while (fileStack.Count > 0) { String filename = fileStack.Pop(); orderedFiles[fileIndex] = filename; fileIndex++; } return(orderedFiles); }
private int GetRelativeIndex(String dependency, String recordId, NameValueCollection query) { ImportData dependencyData = tableDependencies[dependency]; String mainNodeTag = dependencyData.MainNode.Name; String childNodeTag = dependencyData.MainNode.FirstChild.Name; String xpathQuery = "//" + mainNodeTag + "/" + childNodeTag + "[{0}]"; String xpathPredicate = ""; foreach (String fieldName in query) { String fieldValue = query[fieldName]; if (!String.IsNullOrEmpty(xpathPredicate)) { xpathPredicate += " and "; } xpathPredicate += "@" + fieldName + "=" + FixXPath(fieldValue); } // Busca a lista de registros que se enquadram na query XmlNodeList recordList = dependencyData.MainNode.SelectNodes(String.Format(xpathQuery, xpathPredicate)); if (recordList.Count > 1) { int index = 0; foreach (XmlNode record in recordList) { index++; if (record.Attributes["id"].Value == recordId) { return(index); } } } return(0); }
private Boolean ImportFile(String filename, List <int> tenantsToImport, Boolean preserveRecordId) { String tableName = "tb_" + Path.GetFileNameWithoutExtension(filename); progressLog += tableName + Environment.NewLine; XmlNode rowCollection; ImportData importData = new ImportData(filename); currentDatabase = importData.DatabaseName; rowCollection = importData.MainNode; if ((currentDatabase == null) || (rowCollection == null)) { lastError = importData.GetLastError(); return(false); } // Se o XML não possui registros considera como se tivesse importado e retorna if (rowCollection.FirstChild == null) { return(true); } DBQuery dbQuery = new DBQuery(sqlConnection); // Evita alterar o banco de dados pois o Microsoft Azure não tem suporte a essa operação // dbQuery.Query = "use " + currentDatabase; // dbQuery.Execute(false); // Verifica se a tabela já está populada, se estiver aborta ImportController controller = new ImportController(sqlConnection, importData, this); if (!controller.TableIsEmpty()) { lastError = "A importação foi cancelada pois a tabela " + tableName + " já possui dados."; return(false); } try // tenta fazer a inserção dos dados na tabela { controller.MountDependencies(filesToImport, databaseForeignKeys); int?lastInsertedId = 0; while (controller.MoveNextRecord()) { int?owner = controller.GetRecordOwner(); if ((owner == null) || (tenantsToImport.Contains(owner.Value))) { // Conserta o identity para que seja mantida a numeração original if (preserveRecordId) { controller.FixIdentity(lastInsertedId); } dbQuery.Query = controller.MountInsertStatement(); dbQuery.Execute(true); lastInsertedId = dbQuery.ExtractFromResultset(); } progressMeter.IncreaseProgress(1); } } catch (Exception exc) { lastError = exc.Message + Environment.NewLine + progressLog; return(false); } return(true); }