save AbstractMetaDataRepo byte arrays to the database as binary

This commit is contained in:
James Seibel
2023-10-05 19:10:42 -05:00
parent bbaea5e614
commit 756af2bec4
2 changed files with 24 additions and 27 deletions
@@ -63,4 +63,21 @@ public class StringUtil
}
private static final char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
/**
* Converts the given byte array into a hex string representation. <br>
* source: https://stackoverflow.com/a/9855338
*/
public static String byteArrayToHexString(byte[] bytes)
{
char[] hexChars = new char[bytes.length * 2];
for (int i = 0; i < bytes.length; i++)
{
int v = bytes[i] & 0xFF;
hexChars[i * 2] = HEX_ARRAY[v >>> 4];
hexChars[i * 2 + 1] = HEX_ARRAY[v & 0x0F];
}
return new String(hexChars);
}
}
@@ -20,8 +20,8 @@
package com.seibel.distanthorizons.core.sql;
import com.seibel.distanthorizons.core.pos.DhSectionPos;
import com.seibel.distanthorizons.coreapi.util.StringUtil;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Map;
@@ -44,16 +44,7 @@ public abstract class AbstractMetaDataRepo extends AbstractDhRepo<MetaDataDto>
String posString = (String) objectMap.get("DhSectionPos");
DhSectionPos pos = DhSectionPos.deserialize(posString);
String dataString = (String) objectMap.get("Data");
int byteLength = dataString.length() - dataString.replace(",", "").length();
byte[] dataByteArray = new byte[byteLength];
String[] byteStrings = dataString.split(",");
for (int i = 0; i < byteLength; i++)
{
dataByteArray[i] = Byte.parseByte(byteStrings[i]);
}
byte[] dataByteArray = (byte[]) objectMap.get("Data");
MetaDataDto metaFile = new MetaDataDto(pos, dataByteArray);
return metaFile;
@@ -66,14 +57,7 @@ public abstract class AbstractMetaDataRepo extends AbstractDhRepo<MetaDataDto>
public String createInsertSql(MetaDataDto dto)
{
String pos = dto.pos.serialize();
StringBuilder dataStringBuilder = new StringBuilder();
for (byte b : dto.dataArray)
{
dataStringBuilder.append(b).append(',');
}
String dataString = (dataStringBuilder.length() != 0) ? ("'"+dataStringBuilder.toString()+"'") : "NULL";
String dataString = createDataHexString(dto);
return
"INSERT INTO "+this.getTableName()+" (DhSectionPos, Data) " +
"VALUES('"+pos+"',"+dataString+");";
@@ -83,14 +67,7 @@ public abstract class AbstractMetaDataRepo extends AbstractDhRepo<MetaDataDto>
public String createUpdateSql(MetaDataDto dto)
{
String pos = dto.pos.serialize();
StringBuilder dataStringBuilder = new StringBuilder();
for (byte b : dto.dataArray)
{
dataStringBuilder.append(b).append(',');
}
String dataString = (dataStringBuilder.length() != 0) ? ("'"+dataStringBuilder.toString()+"'") : "NULL";
String dataString = createDataHexString(dto);
return
"UPDATE "+this.getTableName()+" " +
"SET Data = "+dataString +
@@ -98,4 +75,7 @@ public abstract class AbstractMetaDataRepo extends AbstractDhRepo<MetaDataDto>
}
/** This creates a string that Sqlite interprets as binary data. */
private static String createDataHexString(MetaDataDto dto) { return "X'" + StringUtil.byteArrayToHexString(dto.dataArray) + "'"; }
}