-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: merged feat/wrapper into workaround/ntnu-git-is-suboptimal
- Loading branch information
Showing
11 changed files
with
704 additions
and
42 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
232 changes: 232 additions & 0 deletions
232
src/main/java/edu/group5/app/control/wrapper/DbWrapper.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,232 @@ | ||
| package edu.group5.app.control.wrapper; | ||
|
|
||
| import java.math.BigDecimal; | ||
| import java.sql.Connection; | ||
| import java.sql.DriverManager; | ||
| import java.sql.PreparedStatement; | ||
| import java.sql.ResultSet; | ||
| import java.sql.SQLException; | ||
| import java.sql.Timestamp; | ||
| import java.util.ArrayList; | ||
| import java.util.Arrays; | ||
| import java.util.HashSet; | ||
| import java.util.List; | ||
| import java.util.Set; | ||
| import java.util.logging.Level; | ||
| import java.util.logging.Logger; | ||
|
|
||
| public class DbWrapper { | ||
| protected Connection connection; | ||
| private static final String CONNECTION_TYPE = "jdbc:h2:"; | ||
| private static final String DB_SCRIPT = "INIT=RUNSCRIPT FROM 'classpath:"; | ||
| private String connectionString; | ||
| private List<Object[]> users; | ||
| private List<Object[]> donations; | ||
| private Logger logger = Logger.getLogger(DbWrapper.class.getName()); | ||
|
|
||
| public DbWrapper(boolean test) { | ||
| if (test) { | ||
| this.connectionString = CONNECTION_TYPE + "mem:test;" + DB_SCRIPT + "test_init.sql'"; | ||
| } else { | ||
| this.connectionString = CONNECTION_TYPE + "file:./help-me-help;" + DB_SCRIPT + "init.sql'"; | ||
| } | ||
| this.logger.info("connectionString constructed"); | ||
| } | ||
|
|
||
| public boolean connect() { | ||
| try { | ||
| this.connection = DriverManager.getConnection(this.connectionString); | ||
| if (this.connection.isValid(0)) { | ||
| this.logger.info("Database connected"); | ||
| return true; | ||
| } else { | ||
| this.logger.warning("Failed to connect to database"); | ||
| return false; | ||
| } | ||
| } catch (SQLException e) { | ||
| this.logger.log(Level.SEVERE, "Failed to connect to database due to exception", e); | ||
| return false; | ||
| } | ||
| } | ||
|
|
||
| public boolean disconnect() { | ||
| try{ this.connection.close(); } catch (Exception e) {}; | ||
| try { | ||
| return this.connection.isClosed(); | ||
| } catch (Exception e) { | ||
| this.logger.log(Level.WARNING, "Failed to check if connection is closed due to exception", e); | ||
| return false; | ||
| } | ||
| } | ||
|
|
||
| private void close(ResultSet results, PreparedStatement ps) { | ||
| try { results.close(); } catch (Exception e) {} | ||
| try { ps.close(); } catch (Exception e) {} | ||
| this.logger.info("results and ps closed"); | ||
| } | ||
|
|
||
| public List<Object[]> importUsers() { | ||
| PreparedStatement ps = null; | ||
| ResultSet results = null; | ||
| try{ | ||
| ps = this.connection.prepareStatement("SELECT * FROM users"); | ||
| results = ps.executeQuery(); | ||
| List<Object[]> data = new ArrayList<Object[]>(); | ||
| while (results.next()) { | ||
| data.add( | ||
| new Object[] { | ||
| results.getInt("user_id"), | ||
| results.getString("role"), | ||
| results.getString("first_name"), | ||
| results.getString("last_name"), | ||
| results.getString("email"), | ||
| results.getString("password_hash") | ||
| }); | ||
| } | ||
| this.users = data; | ||
| this.logger.info("Users imported"); | ||
| } catch (SQLException e) { | ||
| this.logger.log(Level.SEVERE, "Unexpected SQL exception", e); | ||
| } finally { | ||
| this.close(results, ps); | ||
| } | ||
| return this.users; | ||
| } | ||
|
|
||
| public int exportUsers(List<Object[]> data) { | ||
| this.importUsers(); | ||
|
|
||
| if (data == null) { | ||
| throw new IllegalArgumentException("data can't be null"); | ||
| } | ||
| if (data.get(0).length != 6) { | ||
| throw new IllegalArgumentException("data's arrays must have a length of 6"); | ||
| } | ||
| if (data.stream().anyMatch(i -> Arrays.asList(i).contains(null))) { | ||
| throw new IllegalArgumentException("One or more rows in data contains null values"); | ||
| } | ||
| if (this.users.size() > 0) { | ||
| if ((int) data.getLast()[0] <= (int) this.users.getLast()[0]) { | ||
| throw new IllegalArgumentException("data can't contain existing rows"); | ||
| } | ||
| } | ||
| Set<Object> ids = new HashSet<>(); | ||
| if (data.stream().anyMatch(i -> !ids.add(i[0]))) { | ||
| throw new IllegalArgumentException("data can't contain duplicate rows"); | ||
| } | ||
|
|
||
|
|
||
| PreparedStatement ps = null; | ||
| int rowsAffected = 0; | ||
| try { | ||
| ps = this.connection.prepareStatement( | ||
| "INSERT INTO users (user_id, role, first_name, last_name, email, password_hash) VALUES (?, ?, ?, ?, ?, ?)"); | ||
| for (Object[] row : data) { | ||
| try { | ||
| ps.setInt(1, (int) row[0]); | ||
| for (int i = 1; i < row.length; i++) { | ||
| ps.setString(i + 1, (String) row[i]); | ||
| } | ||
| } catch (Exception e) { | ||
| throw new IllegalArgumentException("One or more rows in data contains a wrong datatype"); | ||
| } | ||
| rowsAffected += ps.executeUpdate(); | ||
| } | ||
| this.logger.info("Users exported"); | ||
| } catch (SQLException e) { | ||
| this.logger.log(Level.SEVERE, "Unexpected SQL exception", e); | ||
| } finally { | ||
| this.close(null, ps); | ||
| } | ||
| return rowsAffected; | ||
| } | ||
|
|
||
| private List<Object[]> importDonations() { | ||
| return this.importDonations(0, true); | ||
| } | ||
|
|
||
| public List<Object[]> importDonations(int user_id) { | ||
| return this.importDonations(user_id, false); | ||
| } | ||
|
|
||
| private List<Object[]> importDonations(int user_id, boolean all) { | ||
| PreparedStatement ps = null; | ||
| ResultSet results = null; | ||
| try{ | ||
| if (all) { | ||
| ps = this.connection.prepareStatement("SELECT * FROM donations"); | ||
| } else { | ||
| ps = this.connection.prepareStatement("SELECT * FROM donations WHERE user_id = ?"); | ||
| ps.setInt(1, user_id); | ||
| } | ||
| results = ps.executeQuery(); | ||
| List<Object[]> data = new ArrayList<Object[]>(); | ||
| while (results.next()) { | ||
| data.add( | ||
| new Object[] { | ||
| results.getInt(1), | ||
| results.getInt(2), | ||
| results.getInt(3), | ||
| results.getBigDecimal(4), | ||
| results.getTimestamp(5), | ||
| results.getString(6) | ||
| }); | ||
| } | ||
| this.donations = data; | ||
| this.logger.info("Donations imported"); | ||
| } catch (SQLException e) { | ||
| this.logger.log(Level.SEVERE, "Unexpected SQL exception", e); | ||
| } finally { | ||
| this.close(results, ps); | ||
| } | ||
| return this.donations; | ||
| } | ||
|
|
||
| public int exportDonations(List<Object[]> data) { | ||
| this.importDonations(); | ||
|
|
||
| if (data == null) { | ||
| throw new IllegalArgumentException("data can't be null"); | ||
| } | ||
| if (data.get(0).length != 6) { | ||
| throw new IllegalArgumentException("data's arrays must have a length of 6"); | ||
| } | ||
| if (data.stream().anyMatch(i -> Arrays.asList(i).contains(null))) { | ||
| throw new IllegalArgumentException("One or more rows in data contains null values"); | ||
| } | ||
| if (this.donations.size() > 0 && (int) data.getLast()[0] <= (int) this.donations.getLast()[0]) { | ||
| throw new IllegalArgumentException("data can't contain existing rows"); | ||
| } | ||
| Set<Object> ids = new HashSet<>(); | ||
| if (data.stream().anyMatch(i -> !ids.add(i[0]))) { | ||
| throw new IllegalArgumentException("data can't contain duplicate rows"); | ||
| } | ||
|
|
||
| PreparedStatement ps = null; | ||
| int rowsAffected = 0; | ||
| try { | ||
| ps = this.connection.prepareStatement( | ||
| "INSERT INTO donations (donation_id, user_id, organization_id, amount, dating, payment_method) VALUES (?, (SELECT user_id FROM users WHERE user_id = ?), ?, ?, ?, ?)"); | ||
| for (Object[] row : data) { | ||
| try { | ||
| for (int i = 0; i < 3; i++) { | ||
| ps.setInt(i + 1, (int) row[i]); | ||
| } | ||
| ps.setBigDecimal(4, (BigDecimal) row[3]); | ||
| ps.setTimestamp(5, (Timestamp) row[4]); | ||
| ps.setString(6, (String) row[5]); | ||
| } catch (Exception e) { | ||
| throw new IllegalArgumentException("One or more rows in data contains a wrong datatype"); | ||
| } | ||
| rowsAffected += ps.executeUpdate(); | ||
| } | ||
| this.logger.info("Donations exported"); | ||
| } catch (SQLException e) { | ||
| this.logger.log(Level.SEVERE, "Unexpected SQL exception", e); | ||
| } finally { | ||
| this.close(null, ps); | ||
| } | ||
| return rowsAffected; | ||
| } | ||
|
|
||
| } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,23 @@ | ||
| CREATE TABLE IF NOT EXISTS | ||
| users ( | ||
| user_id INT PRIMARY KEY, | ||
| role VARCHAR(32) NOT NULL, | ||
| first_name VARCHAR(32) NOT NULL, | ||
| last_name VARCHAR(32) NOT NULL, | ||
| email VARCHAR(32) NOT NULL, | ||
| password_hash VARCHAR(72) NOT NULL | ||
| ); | ||
|
|
||
| CREATE TABLE IF NOT EXISTS | ||
| donations ( | ||
| donation_id INT PRIMARY KEY, | ||
| user_id INT NOT NULL, | ||
| organization_id INT NOT NULL, | ||
| amount DECIMAL(32, 16) NOT NULL, | ||
| dating TIMESTAMP NOT NULL, | ||
| payment_method VARCHAR(32) NOT NULL, | ||
| CONSTRAINT fk_user | ||
| FOREIGN KEY (user_id) | ||
| REFERENCES users(user_id) | ||
| ); | ||
|
|
Oops, something went wrong.