예제 #1
0
        public async Task <Maybe <string> > ExportToJson(ICollection <DocumentReference> documents, string name = "")
        {
            var fileName          = ArchiveExtensions.EnsureFileName(name, "export", ".json", true);
            var maybeJsonFileName = await _applicationInteraction.ShowSaveFileDialog("Save Json export", "Json File|*.json", fileName);

            if (maybeJsonFileName.HasValue)
            {
                if (documents.Count == 1)
                {
                    using (var writer = new StreamWriter(maybeJsonFileName.Value))
                    {
                        JsonSerializer.Serialize(documents.First().LiteDocument, writer, true, false);
                    }
                }
                else
                {
                    var data = new BsonArray(documents.Select(a => a.LiteDocument));
                    using (var writer = new StreamWriter(maybeJsonFileName.Value))
                    {
                        JsonSerializer.Serialize(data, writer, true, false);
                    }
                }
            }

            return(maybeJsonFileName);
        }
예제 #2
0
        public async Task <Maybe <string> > ExportToExcel(DataTable dataTable, string name = "")
        {
            var fileName      = ArchiveExtensions.EnsureFileName(name, "export", ".xlsx", true);
            var maybeFileName = await _applicationInteraction.ShowSaveFileDialog("Save Excel export", "Excel File|*.xlsx", fileName);

            if (maybeFileName.HasNoValue)
            {
                return(null);
            }

            var excelPackage = new ExcelPackage();
            var ws           = excelPackage.Workbook.Worksheets.Add(name);

            ws.Cells[@"A1"].LoadFromDataTable(dataTable, true);

            var resultsTable = ws.Tables.Add(ws.Dimension, $"{Regex.Replace(name, @"\s", "_")}_table");

            resultsTable.ShowFilter = true;
            resultsTable.ShowHeader = true;

            // AutoFit
            ws.Cells[ws.Dimension.Address].AutoFitColumns();

            excelPackage.SaveAs(new FileInfo(maybeFileName.Value));
            excelPackage.Dispose();

            return(maybeFileName.Value);
        }
예제 #3
0
        private async Task <Maybe <string> > ExportToJson(ICollection <DocumentReference> documents, string name = "")
        {
            var fileName          = ArchiveExtensions.EnsureFileName(name, "export", ".json", true);
            var maybeJsonFileName = await _applicationInteraction.ShowSaveFileDialog("Save Json export", "Json File|*.json", fileName);

            if (maybeJsonFileName.HasValue)
            {
                if (documents.Count == 1)
                {
                    using (var writer = new StreamWriter(maybeJsonFileName.Value))
                    {
                        documents.First().Serialize(writer, true);
                    }
                }
                else
                {
                    var documentAggregator = new DocumentReferenceAggregator(documents);
                    using (var writer = new StreamWriter(maybeJsonFileName.Value))
                    {
                        documentAggregator.Serialize(writer, true, false);
                    }
                }
            }

            return(maybeJsonFileName);
        }
예제 #4
0
        public async Task <Maybe <string> > ExportToCsv(ICollection <DocumentReference> documents, string name = "")
        {
            var fileName      = ArchiveExtensions.EnsureFileName(name, "export", ".csv", true);
            var maybeFileName = await _applicationInteraction.ShowSaveFileDialog("Save CSV export", "Excel File|*.xlsx", fileName);

            if (maybeFileName.HasNoValue)
            {
                return(null);
            }

            var separator      = ",";
            var reservedTokens = new[] { '\"', ',', '\n', '\r' };
            var keys           = documents.SelectAllDistinctKeys().ToArray();

            var contents = new List <string>
            {
                string.Join(separator, keys)
            };

            string NormalizeValue(BsonValue value)
            {
                string s = null;

                if (!value.IsArray && !value.IsDocument && !value.IsNull)
                {
                    s = Convert.ToString(value.RawValue, CultureInfo.InvariantCulture);
                }

                // Escape reserved tokens
                if (s != null && s.IndexOfAny(reservedTokens) >= 0)
                {
                    s = "\"" + s.Replace("\"", "\"\"") + "\"";
                }

                return(s);
            }

            foreach (var documentReference in documents)
            {
                var rowCols    = new string[keys.Length];
                var currentCol = 0;
                foreach (var key in keys)
                {
                    if (documentReference.LiteDocument.ContainsKey(key))
                    {
                        var bsonValue = documentReference.LiteDocument[key];
                        rowCols[currentCol] = NormalizeValue(bsonValue);
                    }
                    currentCol++;
                }
                contents.Add(string.Join(separator, rowCols));
            }

            File.WriteAllLines(maybeFileName.Value, contents, Encoding.UTF8);

            return(maybeFileName);
        }
예제 #5
0
        public async Task OpenDatabase(string path, string password = "")
        {
            if (Store.Current.IsDatabaseOpen(path))
            {
                return;
            }

            if (!File.Exists(path))
            {
                _applicationInteraction.ShowError("Cannot open database, file not found.", "File not found");
                return;
            }

            if (ArchiveExtensions.GetDriveType(path) == DriveType.Network)
            {
                _applicationInteraction.ShowAlert("Maintaining connection to network files is not guaranteed!", "Network file", UINotificationType.Info);
            }

            try
            {
                if (DatabaseReference.IsDbPasswordProtected(path))
                {
                    var maybePassword = await _applicationInteraction.ShowInputDialog("Database is password protected, enter password:"******"Database password.", password);

                    if (maybePassword.HasNoValue)
                    {
                        return;
                    }

                    password = maybePassword.Value;
                }

                Store.Current.AddDatabase(new DatabaseReference(path, password));

                _recentFilesProvider.InsertRecentFile(path);
            }
            catch (LiteException liteException)
            {
                await OpenDatabaseExceptionHandler(liteException, path, password);
            }
            catch (NotSupportedException notSupportedException)
            {
                _applicationInteraction.ShowError(notSupportedException, "Failed to open database [NotSupportedException]:" + Environment.NewLine + notSupportedException.Message);
            }
            catch (Exception e)
            {
                Logger.Error(e, "Failed to open database: ");
                _applicationInteraction.ShowError(e, "Failed to open database [Exception]:" + Environment.NewLine + e.Message);
            }
        }
예제 #6
0
        public async Task <Maybe <string> > ExportToCsv(DataTable dataTable, string name = "")
        {
            var fileName      = ArchiveExtensions.EnsureFileName(name, "export", ".csv", true);
            var maybeFileName = await _applicationInteraction.ShowSaveFileDialog("Save CSV export", "CSV File|*.csv", fileName);

            if (maybeFileName.HasNoValue)
            {
                return(null);
            }

            var separator      = ",";
            var reservedTokens = new[] { '\"', ',', '\n', '\r' };
            var columnNames    = dataTable.Columns
                                 .Cast <DataColumn>()
                                 .Select(column => column.ColumnName);

            var contents = new List <string>
            {
                string.Join(separator, columnNames)
            };

            string NormalizeValue(object field)
            {
                var value = Convert.ToString(field, CultureInfo.InvariantCulture);

                if (value != null && value.IndexOfAny(reservedTokens) >= 0)
                {
                    value = "\"" + value.Replace("\"", "\"\"") + "\"";
                }
                return(value);
            }

            foreach (DataRow row in dataTable.Rows)
            {
                var fields = row.ItemArray.Select(NormalizeValue);

                contents.Add(string.Join(separator, fields));
            }

            File.WriteAllLines(maybeFileName.Value, contents, Encoding.UTF8);

            return(maybeFileName);
        }
예제 #7
0
        public async Task <Maybe <string> > ExportStoredFiles(ICollection <DocumentReference> documents)
        {
            var documentReference = documents.FirstOrDefault();

            if (!(documentReference?.Collection is FileCollectionReference))
            {
                return(null);
            }

            Maybe <string> maybePath = null;

            if (documents.Count == 1)
            {
                var file = documentReference;
                maybePath = await _applicationInteraction.ShowSaveFileDialog(fileName : file.LiteDocument["filename"]);

                if (maybePath.HasValue)
                {
                    (file.Collection as FileCollectionReference)?.SaveFile(file, maybePath.Value);
                }
            }
            else
            {
                maybePath = await _applicationInteraction.ShowFolderPickerDialog("Select folder to export files to...");

                if (maybePath.HasValue)
                {
                    foreach (var file in documents)
                    {
                        var prefix = file.LiteDocument["_id"].AsString.Replace('/', ' ').Split('.').FirstOrDefault();

                        var path = Path.Combine(maybePath.Value, $"{prefix}-{file.LiteDocument["filename"].AsString}");

                        ArchiveExtensions.EnsureFileDirectory(path);

                        (file.Collection as FileCollectionReference)?.SaveFile(file, path);
                    }
                }
            }

            return(maybePath);
        }
예제 #8
0
        private async Task <Maybe <string> > ExportStoredFiles(ICollection <DocumentReference> documents)
        {
            var fileDocuments = documents.OfType <FileDocumentReference>().ToArray();

            if (!fileDocuments.Any())
            {
                return(null);
            }

            Maybe <string> maybePath;

            if (documents.Count == 1)
            {
                var file = fileDocuments[0];
                maybePath = await _applicationInteraction.ShowSaveFileDialog(fileName : file.Filename);

                if (maybePath.HasValue)
                {
                    file.SaveFile(maybePath.Value);
                }
            }
            else
            {
                maybePath = await _applicationInteraction.ShowFolderPickerDialog("Select folder to export files to...");

                if (maybePath.HasValue)
                {
                    foreach (var file in fileDocuments)
                    {
                        var prefix = file.GetIdAsFilename();

                        var path = Path.Combine(maybePath.Value, $"{prefix}-{file.Filename}");

                        ArchiveExtensions.EnsureFileDirectory(path);

                        file.SaveFile(path);
                    }
                }
            }

            return(maybePath);
        }
예제 #9
0
        public async Task <Maybe <string> > ExportToJson(IJsonSerializerProvider provider, string fileName = "")
        {
            var exportFileName = "export.json";

            if (!string.IsNullOrEmpty(fileName))
            {
                exportFileName = ArchiveExtensions.EnsureFileNameExtension(fileName, ".json");
            }

            var maybeFileName = await _applicationInteraction.ShowSaveFileDialog("Save Json export", "Json File|*.json", exportFileName);

            if (maybeFileName.HasValue)
            {
                using (var writer = new StreamWriter(maybeFileName.Value))
                {
                    provider.Serialize(writer, true);
                }
            }

            return(maybeFileName);
        }
예제 #10
0
        public async Task <Maybe <string> > ExportToExcel(ICollection <DocumentReference> documents, string name = "")
        {
            var fileName      = ArchiveExtensions.EnsureFileName(name, "export", ".xlsx", true);
            var maybeFileName = await _applicationInteraction.ShowSaveFileDialog("Save Excel export", "Excel File|*.xlsx", fileName);

            if (maybeFileName.HasNoValue)
            {
                return(null);
            }

            var keys = documents.SelectAllDistinctKeys().ToArray();

            var excelPackage = new ExcelPackage();
            var ws           = excelPackage.Workbook.Worksheets.Add(name);

            // Add headers
            for (var i = 0; i < keys.Length; i++)
            {
                ws.Cells[1, i + 1].Value = keys[i];
            }

            // Add data
            var currentColl = 1;
            var currentRow  = 2;

            foreach (var documentReference in documents)
            {
                foreach (var key in keys)
                {
                    if (documentReference.LiteDocument.ContainsKey(key))
                    {
                        var    bsonValue = documentReference.LiteDocument[key];
                        object cellValue = null;
                        if (bsonValue.IsArray || bsonValue.IsDocument)
                        {
                            cellValue = bsonValue.ToDisplayValue();
                        }
                        else
                        {
                            cellValue = bsonValue.RawValue;
                        }

                        var cell = ws.Cells[currentRow, currentColl];
                        cell.Value = cellValue;
                        if (BsonTypeToExcelNumberFormat.TryGetValue(bsonValue.Type, out var format))
                        {
                            cell.Style.Numberformat.Format = format(bsonValue);
                        }
                    }

                    currentColl++;
                }

                currentColl = 1;
                currentRow++;
            }

            var tableRange   = ws.Cells[1, 1, documents.Count + 1, keys.Length];
            var resultsTable = ws.Tables.Add(tableRange, $"{Regex.Replace(name, @"\s", "_")}_table");

            resultsTable.ShowFilter = true;
            resultsTable.ShowHeader = true;

            // AutoFit
            ws.Cells[ws.Dimension.Address].AutoFitColumns();

            excelPackage.SaveAs(new FileInfo(maybeFileName.Value));
            excelPackage.Dispose();

            return(maybeFileName.Value);
        }
예제 #11
0
        public async Task OpenDatabase(string path, string password = "")
        {
            if (Store.Current.IsDatabaseOpen(path))
            {
                return;
            }

            if (!File.Exists(path))
            {
                _applicationInteraction.ShowError("Cannot open database, file not found.", "File not found");
                return;
            }

            if (ArchiveExtensions.GetDriveType(path) == DriveType.Network)
            {
                _applicationInteraction.ShowAlert("Maintaining connection to network files is not guaranteed!", "Network file", UINotificationType.Info);
            }

            try
            {
                var rememberMe = false;
                if (DatabaseReference.IsDbPasswordProtected(path))
                {
                    if (string.IsNullOrWhiteSpace(password) && _recentDatabaseFilesProvider.TryGetPassword(path, out var storedPassword))
                    {
                        password   = storedPassword;
                        rememberMe = true;
                    }

                    var maybePasswordInput = await _applicationInteraction.ShowPasswordInputDialog("Database is password protected, enter password:"******"Database password.", password, rememberMe);

                    if (maybePasswordInput.HasNoValue)
                    {
                        return;
                    }

                    password   = maybePasswordInput.Value.Password;
                    rememberMe = maybePasswordInput.Value.RememberMe;
                }

                var connectionOptions = new DatabaseConnectionOptions(path, password)
                {
                    Mode = Properties.Settings.Default.Database_ConnectionFileMode
                };

                var databaseReference = new DatabaseReference(connectionOptions);

                Store.Current.AddDatabase(databaseReference);

                if (!string.IsNullOrEmpty(password) && rememberMe)
                {
                    _recentDatabaseFilesProvider.InsertRecentFile(databaseReference.DatabaseVersion, path, password);
                }
                else
                {
                    _recentDatabaseFilesProvider.InsertRecentFile(databaseReference.DatabaseVersion, path);
                }
            }
            catch (LiteException liteException)
            {
                await OpenDatabaseExceptionHandler(liteException, path, password);
            }
            catch (NotSupportedException notSupportedException)
            {
                _applicationInteraction.ShowError(notSupportedException, "Failed to open database [NotSupportedException]:" + Environment.NewLine + notSupportedException.Message);
            }
            catch (Exception e)
            {
                Logger.Error(e, "Failed to open database: ");
                _applicationInteraction.ShowError(e, "Failed to open database [Exception]:" + Environment.NewLine + e.Message);
            }
        }