Skip to content

Commit 64d4031

Browse files
committed
Add Firebird .NET provider output format
1 parent e206bf5 commit 64d4031

File tree

3 files changed

+84
-0
lines changed

3 files changed

+84
-0
lines changed

internal-tools/src/main/java/org/firebirdsql/internal/tools/MessageConverter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ static String toJaybirdMessageFormat(String fbMessage) {
5656
return sb.toString();
5757
}
5858

59+
static String toNetProviderMessageFormat(String fbMessage) {
60+
// Format is the same as Jaybird's
61+
return toJaybirdMessageFormat(fbMessage);
62+
}
63+
5964
static String toSqlState(String sqlStateClass, String sqlStateSubClass) {
6065
if (sqlStateClass.length() != 2) {
6166
throw new IllegalArgumentException("SQLSTATE class must be 2 characters, was: '" + sqlStateClass + "'");
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
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+
}

internal-tools/src/main/java/org/firebirdsql/internal/tools/OutputFormat.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ public enum OutputFormat {
2727
* </p>
2828
*/
2929
LANG_REF_CSV(LangRefCsvStore::new),
30+
/**
31+
* Format of Firebird .NET provider (FirebirdSql.Data.FirebirdClient) {@code IscErrorMessages.cs} class.
32+
*/
33+
NET_PROVIDER(NetProviderStore::new),
3034
;
3135

3236
private final Supplier<FirebirdErrorStore> messageStoreSupplier;

0 commit comments

Comments
 (0)