/// <summary> /// Функция, предназначенная для распарсивания файла 'tmx' /// Translation Memory Exchange Format — Обмен памятью переводов /// </summary> /// <param name="fs">Поток tmx-файла миграции</param> public void Load(FileStream fs) { try { _logger.WriteLn("Распарсивание tmx-файла"); //var tempFileName = Path.GetTempFileName(); //fs.Seek(0, SeekOrigin.Begin); //fs.CopyTo(System.IO.File.Open(tempFileName, FileMode.Open)); var tempFileName = tWriter.CopyFile(fs); var d = XDocument.Load(tempFileName); var srclang = d.Root.Element("header").Attribute("srclang"); var body = d.Root.Element("body"); var ns_xml = body.GetNamespaceOfPrefix("xml"); foreach (var tu in body.Elements("tu")) { Hashtable ht = new Hashtable(); Guid? newTermId = null; foreach (var tuv in tu.Elements("tuv")) { var lang = tuv.Attribute(ns_xml + "lang").Value; var trans = tuv.Element("seg").Value; tWriter.AppendTable(ht, lang, trans); //newTermId = tWriter.AddTranslationSubstring(lang, ht, newTermId, memoryId, (Guid)memory.id_file); try { TranslationSubstring termString = tWriter.AddTranslationSubstring(lang, ht, newTermId, memoryId, (Guid)memory.id_file); if (termString != null) { newTermId = ts.AddAsync(termString).Result; gsr.AddTranslationMemoriesStrings((Guid)memoryId, (Guid)newTermId); //newTermId = glossaryRep.AddNewTermAsync(memoryId, termString, null).Result; } } catch (Exception exc) { _logger.WriteLn("ERROR: Перевод [" + trans + "] на язык [" + lang + "] " + exc.Message, exc); } } foreach (var lang in ht.Keys) { tWriter.AddTranslation(lang, newTermId, ht); } } System.IO.File.Delete(tempFileName); _logger.WriteLn("tmx-файл успешно распарсен"); } catch (Exception ex) { _loggerError.WriteLn($"Ошибка в {typeof(TmxReader)}.{nameof(Load)}", ex); } }
public async Task <bool> UploadAsync(File file, IEnumerable <Locale> locales) { var sqlString = this._insertFileSql + " RETURNING id"; using (var connection = new NpgsqlConnection(connectionString)) { connection.Open(); using (IDbTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadCommitted)) { try { this.LogQuery(sqlString, file.GetType(), file); var insertedId = await connection.ExecuteScalarAsync <Guid?>(sqlString, file, transaction); if (!insertedId.HasValue) { this._loggerError.WriteLn("Не удалось загрузить файл в базу"); transaction.Rollback(); return(false); } file.id = insertedId.Value; if (file.is_folder) { /*Логирование*/ _action.AddAddFileActionAsync(file, file.id, WorkTypes.AddFile); /**/ transaction.Commit(); return(true); } var translationSubstrings = new Parser().Parse(file); var translationSubstringsCount = translationSubstrings.Count; var n = translationSubstringsCount; foreach (var translationSubstring in translationSubstrings) { this.LogQuery(sqlString, translationSubstring.GetType(), translationSubstring); //n -= await connection.ExecuteAsync(sqlString, translationSubstring, transaction); //var idOfInsertedRow = await connection.ExecuteScalarAsync<int>(sqlString, translationSubstring, transaction); var idOfInsertedRow = _tsr.AddAsync(translationSubstring, connection, transaction); if (idOfInsertedRow != null) { n--; //Мапим языки List <Guid> newLoc = new List <Guid>(); foreach (var lc in locales) { newLoc.Add(lc.id); } // _tsr.AddTranslationLocalesAsync(idOfInsertedRow, newLoc); _tsr.AddTranslationLocalesTransactAsync(idOfInsertedRow, newLoc, connection, transaction); } } if (n == 0) { //TODO word_count file.strings_count = translationSubstringsCount; sqlString = "UPDATE files SET strings_count = @Strings_Count WHERE id = @Id"; this.LogQuery(sqlString, file.GetType(), file); await connection.ExecuteAsync(sqlString, file, transaction); } transaction.Commit(); return(n == 0); } catch (NpgsqlException exception) { this._loggerError.WriteLn( $"Ошибка в {nameof(FilesRepository)}.{nameof(FilesRepository.UploadAsync)} {nameof(NpgsqlException)} ", exception); transaction.Rollback(); return(false); } catch (ParserException exception) { this._loggerError.WriteLn("Ошибка в блоке распарсивания: ", exception); //здесь фронтенд создает новый объект Parser и с помощью функции UseAllParsers получает Dictonary со всевозможными вариантами распарсивания //ошибка возникает (пока) только в двух случаях: файл имеет неподдерживаемое системой расширение или внутри него не обнаружено строк для перевода transaction.Rollback(); throw; } catch (Exception exception) { this._loggerError.WriteLn( $"Ошибка в {nameof(FilesRepository)}.{nameof(FilesRepository.UploadAsync)} {nameof(Exception)} ", exception); transaction.Rollback(); return(false); } } } }