class DbMigration {
// constants {{{
- static final boolean CONFIG_PRINT_DB = false;
+ static final boolean CONFIG_PRINT_DB = true;
static final String CSV_SEPARATOR = ",";
- static final String DB_URL = "jdbc:postgresql:users";
+ static final String DB_URL = "jdbc:postgresql:migration";
+ static final int DB_BATCH_SIZE = 10;
static final String SQL_GET_USERS = "SELECT * FROM users;";
static final String SQL_UPSERT_USER =
"""
- INSERT INTO users VALUES (?, ?, ?, ?, ?)
- ON CONFLICT (ID)
- DO UPDATE SET
- Mail = EXCLUDED.Mail,
- CanRead = EXCLUDED.CanRead,
- CanWrite = EXCLUDED.CanWrite,
- CanDelete = EXCLUDED.CanDelete
- ;
+ INSERT INTO users VALUES (?, ?, ?, ?, ?)
+ ON CONFLICT (USER_ID)
+ DO UPDATE SET
+ MAIL = EXCLUDED.MAIL,
+ CAN_READ = EXCLUDED.CAN_READ,
+ CAN_WRITE = EXCLUDED.CAN_WRITE,
+ CAN_DELETE = EXCLUDED.CAN_DELETE
+ ;
""";
+
// }}}
// user {{{
+ public record Role(boolean read, boolean write, boolean delete) {
+ static final Role Default = new Role(false, false, false);
+ }
+
public record User(int id, String mail, Role role) {
public String toString() {
return this.id + " " + this.mail + " " + this.role;
}
}
- // }}}
- // role {{{
- public record Role(boolean read, boolean write, boolean delete) {
- static final Role Default = new Role(false, false, false);
- }
// }}}
// csv {{{
- public static String[][] LoadCSV(String filename) throws IOException {
+ public static ArrayList<String[]> LoadCSV(String filename) throws IOException {
var path = Paths.get(filename);
- return Files.lines(path)
+ var list = Files.lines(path)
.skip(1)
.map(line -> line.split(CSV_SEPARATOR))
- .toArray(String[][]::new);
+ .toList();
+ return new ArrayList<String[]>(list);
}
+
// }}}
// db {{{
var users = new ArrayList<User>();
try (var st = conn.createStatement();
- var rs = st.executeQuery(SQL_GET_USERS); ) {
+ var rs = st.executeQuery(SQL_GET_USERS); ) {
while (rs.next()) {
var userId = rs.getInt(1);
var userMail = rs.getString(2);
return users.toArray(User[]::new);
}
+
// }}}
- // main {{{
public static void main(String[] args) {
// filenames from command line args {{{
if (args.length != 2) {
// }}}
// read csvs {{{
- String[][] csvUsers;
- String[][] csvRoles;
+ ArrayList<String[]> csvUsers;
+ ArrayList<String[]> csvRoles;
try {
csvUsers = LoadCSV(filenameUsers);
csvRoles = LoadCSV(filenameRoles);
return;
}
// }}}
+
+ // Sparkassen Nutzer aussortieren {{{
+ csvUsers.removeIf(row -> row[1].endsWith("@sparkasse.de"));
+ // }}}
// process roles {{{
+ // - read roles.csv line by line
+ // - get user_id and role from each line
+ // - make sure user_id is in the HashMap
+ // - if not create default value with no roles
+ // - update the role specified in that line
var roles = new HashMap<Integer, Role>();
for (var row : csvRoles) {
// get id and single role
try (var conn = DriverManager.getConnection(DB_URL)) {
var users = getUsers(conn);
- System.out.println("DB before update:");
+ System.out.println("Before update:");
for (var user : users) {
System.out.println(user);
}
// open db connection for updating {{{
try (var conn = DriverManager.getConnection(DB_URL);
- var stmt = conn.prepareStatement(SQL_UPSERT_USER); ) {
+ var stmt = conn.prepareStatement(SQL_UPSERT_USER); ) {
+
// batching
+ int batchIndex = 0;
conn.setAutoCommit(false);
// update db from csv
User user = new User(userId, userMail, userRoles);
insertUser(stmt, user);
+
+ // batching
+ batchIndex += 1;
+ if (batchIndex > DB_BATCH_SIZE) {
+ stmt.executeBatch();
+ batchIndex = 0;
+ }
}
- // commit batch
+ // commit all outstanding changes
stmt.executeBatch();
conn.commit();
} catch (SQLException e) {
System.out.println("Updated successfully");
}
- // }}}
}