/// <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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
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);
        }