|
| 1 | +// SPDX-FileCopyrightText: Copyright 2025 Mark Rotteveel |
| 2 | +// SPDX-License-Identifier: LGPL-2.1-or-later |
| 3 | +package org.firebirdsql.internal.tools; |
| 4 | + |
| 5 | +import java.io.IOException; |
| 6 | +import java.io.Writer; |
| 7 | +import java.nio.charset.StandardCharsets; |
| 8 | +import java.nio.file.Files; |
| 9 | +import java.nio.file.Path; |
| 10 | +import java.util.Comparator; |
| 11 | +import java.util.SortedSet; |
| 12 | +import java.util.TreeSet; |
| 13 | + |
| 14 | +import static org.firebirdsql.internal.tools.MessageConverter.toNetProviderMessageFormat; |
| 15 | + |
| 16 | +/** |
| 17 | + * Generates the list of error messages as used by the Firebird .NET Provider, class {@code FirebirdSql.Data.Common.IscErrorMessages}. |
| 18 | + * |
| 19 | + * @author Mark Rotteveel |
| 20 | + * @since 7 |
| 21 | + */ |
| 22 | +class NetProviderStore implements FirebirdErrorStore { |
| 23 | + |
| 24 | + private static final Comparator<FirebirdError> FIREBIRD_ERROR_COMPARATOR = |
| 25 | + Comparator.comparingInt(FirebirdError::errorCode); |
| 26 | + |
| 27 | + private final SortedSet<FirebirdError> firebirdErrors = new TreeSet<>(FIREBIRD_ERROR_COMPARATOR); |
| 28 | + |
| 29 | + @Override |
| 30 | + public void addFirebirdError(FirebirdError firebirdError) { |
| 31 | + firebirdErrors.add(firebirdError); |
| 32 | + } |
| 33 | + |
| 34 | + @Override |
| 35 | + public void reset() { |
| 36 | + firebirdErrors.clear(); |
| 37 | + } |
| 38 | + |
| 39 | + @Override |
| 40 | + public void save() throws IOException { |
| 41 | + try (var out = Files.newBufferedWriter(Path.of("IscErrorMessages-fragment.cs"), StandardCharsets.UTF_8)) { |
| 42 | + for (FirebirdError error : firebirdErrors) { |
| 43 | + writeError(out, error); |
| 44 | + } |
| 45 | + } |
| 46 | + } |
| 47 | + |
| 48 | + private void writeError(Writer out, FirebirdError error) throws IOException { |
| 49 | + out.append("\t{") |
| 50 | + .append(String.valueOf(error.errorCode())).append(", ") |
| 51 | + .append(enquoteCsharpString(toNetProviderMessageFormat(error.message()))) |
| 52 | + .append("},"); |
| 53 | + if (error.hasSymbolName()) { |
| 54 | + out.append("\t\t/* ").append(error.symbolName()).append(" */"); |
| 55 | + } |
| 56 | + out.append("\n"); |
| 57 | + } |
| 58 | + |
| 59 | + private String enquoteCsharpString(String message) { |
| 60 | + var builder = new StringBuilder(2 + (int) (message.length() * 1.1f)); |
| 61 | + builder.append('"'); |
| 62 | + for (char c : message.toCharArray()) { |
| 63 | + switch (c) { |
| 64 | + case '\r' -> { /* do nothing */ } |
| 65 | + case '\n' -> builder.append("\\n"); |
| 66 | + case '\t' -> builder.append("\\t"); |
| 67 | + case '"' -> builder.append("\\\""); |
| 68 | + case '\\' -> builder.append("\\\\"); |
| 69 | + default -> builder.append(c); |
| 70 | + } |
| 71 | + } |
| 72 | + builder.append('"'); |
| 73 | + return builder.toString(); |
| 74 | + } |
| 75 | +} |
0 commit comments