package org.gcube.accounting.utility.postgresql; import java.io.Serializable; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.SortedSet; import java.util.TreeSet; import org.gcube.documentstore.records.Record; public class PostgreSQLQuery { public static final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS Z"; protected StringBuffer stringBuffer; protected String getQuotedString(String string) { StringBuffer buffer = new StringBuffer(); buffer.append("'"); buffer.append(string); buffer.append("'"); return buffer.toString(); } protected void appendString(String string) { stringBuffer.append("'"); stringBuffer.append(string); stringBuffer.append("'"); } protected void appendValue(Serializable serializable) { stringBuffer.append(getValue(serializable)); } protected String getValue(Serializable serializable) { if(serializable instanceof Number) { return serializable.toString(); } if(serializable instanceof Calendar) { Calendar calendar = (Calendar) serializable; SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATETIME_PATTERN); String date = simpleDateFormat.format(calendar.getTime()); return getQuotedString(date); } if(serializable instanceof Enum) { Enum e = (Enum) serializable; return getQuotedString(e.name()); } // String, URI etc return getQuotedString(serializable.toString()); } public String getSQLInsertCommand(Record record) throws Exception { stringBuffer = new StringBuffer(); RecordToDBFields recordToDBFields = RecordToDBMapping.getRecordToDB(record.getClass()); stringBuffer.append("INSERT INTO "); stringBuffer.append(recordToDBFields.getTableName()); boolean first = true; SortedSet keys = new TreeSet<>(record.getRequiredFields()); StringBuffer values = new StringBuffer(); for(String key : keys) { if(first) { stringBuffer.append(" ("); values.append(" ("); first = false; }else { stringBuffer.append(","); values.append(","); } String dbField = recordToDBFields.getTableField(key); stringBuffer.append(dbField); switch (key) { case "creationTime": case "startTime": case "endTime": Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis((long) record.getResourceProperty(key)); values.append(getValue(calendar)); break; default: values.append(getValue(record.getResourceProperty(key))); break; } } stringBuffer.append(") VALUES"); stringBuffer.append(values); stringBuffer.append(");"); return stringBuffer.toString(); } }