2.4.21. Verwenden des BCD-Formats

BCD steht für „binary coded decimal“ und bezeichnet ein binäres Datenformat. Das Format wurde aus Gründen der Platzersparnis entworfen und ist daher gerade bei Legacy-Anwendungen häufiger anzutreffen. Im BCD-Format werden Ziffern jeweils in einem Nibble (4 Bit eines Bytes) abgelegt, sodass zwei Ziffern nur ein Byte belegen. Speichert man z.B. das Datum 31122012 im BCD-Format, benötigt man lediglich vier Byte. Jedes Byte speichert dabei 2 Ziffern. Am Beispiel der 31 bedeutet dies, dass die 3 im höheren Nibble und die 1 im niedrigen Nibble gespeichert wird. Binär sieht das dann wie folgt aus: 0011 0001. Dies wiederum entspricht der Zahl 49. Es ist zu beachten, dass Bytes in Java das Zweierkomplement verwenden. Das Byte 1001 0001 (BCD „91“) entspricht somit der Zahl -111 = -128 (1000 0000) + 17 (0001 0001) und nicht 145 = 128 (1000 0000) + 17 (0001 0001).

In der Regel ist es nicht sehr sinnvoll, binäre Vergleiche im Rahmen von Datenbanktests durchzuführen. Aus diesem Grund unterstützt DbUnit lediglich ein Binärformat: Base64. Es ist somit möglich, Binärdaten in die Datenbank einzuspielen und zu vergleichen. Bei der Verwendung von BCD-Werten müsste somit erst eine Konvertierung in das Base64-Format erfolgen, um die Daten in den Testdaten verwenden zu können. Dieses Vorgehen ist zum einen jedoch aufwändiger als direkt die BCD-Werte anzugeben. Zum anderen können die fachlichen Inhalte von BCD-Werten in der Regel einfach gelesen werden. Dies Lesbarkeit geht mit der Base64-Kodierung verloren. Aus diesem Grund unterstützt checkerberry db direkt das BCD-Format.

Für die Verwendung des BCD-Formats gibt es zwei unterschiedliche Möglichkeiten. Zum einen kann das BCD-Format einfach über eine Funktion verwendet werden. In diesem Fall werden jedoch die BCD-Daten bei einem Datenbankdump in Base64 dargestellt. Durch die Verwendung der Funktion wird somit lediglich die Lesbarkeit der BCD-Werte in den Testdaten verbessert. Zum anderen kann das interne Binärformat vollständig von Base64 auf BCD umgestellt werden. In diesem Fall werden die Binärdaten auch im Datenbankdump immer im BCD-Format dargestellt.

2.4.21.1. Verwenden von BCD über eine Funktion

Checkerberry db enthält eine Funktion zur Konvertierung von BCD-Formaten in Base64. Durch die Verwendung der Funktion in den Testdaten können die Daten im BCD-Format angegeben werden, wobei intern weiterhin Base64-Werte verwendet werden. Der Einsatz dieser Funktion ist sinnvoll, wenn die Verwendung von BCD-Formaten nur vereinzelt erforderlich ist und zusätzlich binäre Daten in Base64-Kodierung verwendet werden sollen.

Das folgende Beispiel zeigt die Verwendung der Funktion in den Testdaten:

Beispiel 2.56. Funktion bcdToBase64

<dataset>
  <USERS ID="1" NAME="Simpson" BIRTHDATE="->bcdToBase64(X'31121950')" />
</dataset>


Durch die Verwendung der Funktion bleiben die BCD-Werte in den Testdaten lesbar. Im Beispiel wird das Datum 31.12.1950 in den Testdaten verwendet. Es ist jedoch zu beachten, dass Vergleiche nach wie vor in Base64 erfolgen. Gibt es somit eine Abweichung in dem erwarteten und tatsächlichen BCD-Wert, werden in der Fehlermeldung beide Werte in Base64 dargestellt.

Die Java-Klasse BcdToBase64Function (in Package de.conceptpeople.checkerberry.db.core.functions) ist standardmäßig in checkerberry db nicht aktiviert. Um die Funktion verwenden zu können, muss sie daher zunächst in der Konfiguration registriert werden. Das folgende Code-Beispiel zeigt den erforderlichen Aufruf.

Beispiel 2.57. Funktion bcdToBase64 registrieren

public class ConfigurationCallback implements DbConfigurationCallback {
  public void configure(DbConfiguration configuration) {
    configuration.registerFunction("bcdToBase64", new BcdToBase64Function());
  }
}


Weitere Informationen zum Thema Funktionen sind in Abschnitt 2.4.9, „Dynamische Testdaten durch Funktionen“ dargestellt.