diff --git a/util/src/main/java/org/killbill/billing/util/export/dao/DatabaseExportDao.java b/util/src/main/java/org/killbill/billing/util/export/dao/DatabaseExportDao.java
index 7343dbf..1f37627 100644
--- a/util/src/main/java/org/killbill/billing/util/export/dao/DatabaseExportDao.java
+++ b/util/src/main/java/org/killbill/billing/util/export/dao/DatabaseExportDao.java
@@ -23,17 +23,16 @@ import java.util.Map;
import javax.inject.Inject;
import javax.inject.Singleton;
-import org.skife.jdbi.v2.Handle;
-import org.skife.jdbi.v2.IDBI;
-import org.skife.jdbi.v2.ResultIterator;
-import org.skife.jdbi.v2.tweak.HandleCallback;
-
+import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.util.api.ColumnInfo;
import org.killbill.billing.util.api.DatabaseExportOutputStream;
-import org.killbill.billing.callcontext.InternalTenantContext;
import org.killbill.billing.util.dao.TableName;
import org.killbill.billing.util.validation.DefaultColumnInfo;
import org.killbill.billing.util.validation.dao.DatabaseSchemaDao;
+import org.skife.jdbi.v2.Handle;
+import org.skife.jdbi.v2.IDBI;
+import org.skife.jdbi.v2.ResultIterator;
+import org.skife.jdbi.v2.tweak.HandleCallback;
@Singleton
public class DatabaseExportDao {
@@ -48,6 +47,35 @@ public class DatabaseExportDao {
this.dbi = dbi;
}
+ private enum TableType {
+ /* TableName.ACCOUNT */
+ KB_ACCOUNT("record_id", "tenant_record_id"),
+ /* TableName.ACCOUNT_HISTORY */
+ KB_ACCOUNT_HISTORY("target_record_id", "tenant_record_id"),
+ /* Any per-account data table */
+ KB_PER_ACCOUNT("account_record_id", "tenant_record_id"),
+ /* bus_events, notifications table */
+ NOTIFICATION("search_key1", "search_key2"),
+ /* To be discarded */
+ OTHER(null, null);
+
+ private final String accountRecordIdColumnName;
+ private final String tenantRecordIdColumnName;
+
+ TableType(final String accountRecordIdColumnName, final String tenantRecordIdColumnName) {
+ this.accountRecordIdColumnName = accountRecordIdColumnName;
+ this.tenantRecordIdColumnName = tenantRecordIdColumnName;
+ }
+
+ public String getAccountRecordIdColumnName() {
+ return accountRecordIdColumnName;
+ }
+
+ public String getTenantRecordIdColumnName() {
+ return tenantRecordIdColumnName;
+ }
+ }
+
public void exportDataForAccount(final DatabaseExportOutputStream out, final InternalTenantContext context) {
if (context.getAccountRecordId() == null || context.getTenantRecordId() == null) {
return;
@@ -72,8 +100,19 @@ public class DatabaseExportDao {
exportDataForAccountAndTable(out, columnsForTable, context);
}
+
private void exportDataForAccountAndTable(final DatabaseExportOutputStream out, final List<ColumnInfo> columnsForTable, final InternalTenantContext context) {
- boolean hasAccountRecordIdColumn = false;
+
+
+ TableType tableType = TableType.OTHER;
+ final String tableName = columnsForTable.get(0).getTableName();
+
+ if (TableName.ACCOUNT.getTableName().equals(tableName)) {
+ tableType = TableType.KB_ACCOUNT;
+ } else if (TableName.ACCOUNT_HISTORY.getTableName().equals(tableName)) {
+ tableType = TableType.KB_ACCOUNT_HISTORY;
+ }
+
boolean firstColumn = true;
final StringBuilder queryBuilder = new StringBuilder("select ");
for (final ColumnInfo column : columnsForTable) {
@@ -84,27 +123,29 @@ public class DatabaseExportDao {
}
queryBuilder.append(column.getColumnName());
- if (column.getColumnName().equals("account_record_id")) {
- hasAccountRecordIdColumn = true;
+
+ if (tableType == TableType.OTHER) {
+ if (column.getColumnName().equals(TableType.KB_PER_ACCOUNT.getAccountRecordIdColumnName())) {
+ tableType = TableType.KB_PER_ACCOUNT;
+ } else if (column.getColumnName().equals(TableType.NOTIFICATION.getAccountRecordIdColumnName())) {
+ tableType = TableType.NOTIFICATION;
+ }
}
}
- final String tableName = columnsForTable.get(0).getTableName();
- final boolean isAccountTable = TableName.ACCOUNT.getTableName().equals(tableName);
-
// Don't export non-account specific tables
- if (!isAccountTable && !hasAccountRecordIdColumn) {
+ if (tableType == TableType.OTHER) {
return;
}
// Build the query - make sure to filter by account and tenant!
queryBuilder.append(" from ")
- .append(tableName);
- if (isAccountTable) {
- queryBuilder.append(" where record_id = :accountRecordId and tenant_record_id = :tenantRecordId");
- } else {
- queryBuilder.append(" where account_record_id = :accountRecordId and tenant_record_id = :tenantRecordId");
- }
+ .append(tableName)
+ .append(" where ")
+ .append(tableType.getAccountRecordIdColumnName())
+ .append(" = :accountRecordId and ")
+ .append(tableType.getTenantRecordIdColumnName())
+ .append(" = :tenantRecordId");
// Notify the stream that we're about to write data for a different table
out.newTable(tableName, columnsForTable);
@@ -124,7 +165,6 @@ public class DatabaseExportDao {
} finally {
iterator.close();
}
-
return null;
}
});
diff --git a/util/src/test/java/org/killbill/billing/util/export/dao/TestDatabaseExportDao.java b/util/src/test/java/org/killbill/billing/util/export/dao/TestDatabaseExportDao.java
index 855320f..a4ffe97 100644
--- a/util/src/test/java/org/killbill/billing/util/export/dao/TestDatabaseExportDao.java
+++ b/util/src/test/java/org/killbill/billing/util/export/dao/TestDatabaseExportDao.java
@@ -81,12 +81,13 @@ public class TestDatabaseExportDao extends UtilTestSuiteWithEmbeddedDB {
// Verify new dump
final String newDump = getDump();
Assert.assertEquals(newDump, "-- accounts record_id,id,external_key,email,name,first_name_length,currency,billing_cycle_day_local,payment_method_id,time_zone,locale,address1,address2,company_name,city,state_or_province,country,postal_code,phone,migrated,is_notified_for_invoices,created_date,created_by,updated_date,updated_by,tenant_record_id\n" +
- String.format("%s,\"%s\",,%s,%s,%s,,,,,,,,,,,,,,false,%s,\"%s\",%s,\"%s\",%s,%s", internalCallContext.getAccountRecordId(), accountId, accountEmail, accountName, firstNameLength,
+ String.format("%s,%s,,%s,%s,%s,,,,,,,,,,,,,,false,%s,%s,%s,%s,%s,%s", internalCallContext.getAccountRecordId(), accountId, accountEmail, accountName, firstNameLength,
isNotifiedForInvoices, "1970-05-24T18:33:02.000+0000", createdBy, "1982-02-18T20:03:42.000+0000", updatedBy, internalCallContext.getTenantRecordId()) + "\n" +
"-- " + tableNameA + " record_id,a_column,account_record_id,tenant_record_id\n" +
"1,a," + internalCallContext.getAccountRecordId() + "," + internalCallContext.getTenantRecordId() + "\n" +
"-- " + tableNameB + " record_id,b_column,account_record_id,tenant_record_id\n" +
"1,b," + internalCallContext.getAccountRecordId() + "," + internalCallContext.getTenantRecordId() + "\n");
+
}
private String getDump() {