1
0
Fork 0
mirror of https://github.com/pgpainless/pgpainless.git synced 2025-09-14 20:59:39 +02:00

Separate DAO class for SubkeyLoopkup database operations

This commit is contained in:
Paul Schaub 2022-02-26 16:49:54 +01:00
parent 42bd4f1e87
commit e9434f8d9e
Signed by: vanitasvitae
GPG key ID: 62BEE9264BF17311
6 changed files with 84 additions and 46 deletions

View file

@ -0,0 +1,47 @@
// SPDX-FileCopyrightText: 2022 Paul Schaub <vanitasvitae@fsfe.org>
//
// SPDX-License-Identifier: Apache-2.0
package pgp.cert_d.jdbc.sqlite;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import pgp.certificate_store.SubkeyLookup;
public class DatabaseSubkeyLookup implements SubkeyLookup {
private final SubkeyLookupDao dao;
public DatabaseSubkeyLookup(SubkeyLookupDao dao) {
this.dao = dao;
}
@Override
public Set<String> getCertificatesForSubkeyId(long subkeyId) throws IOException {
try {
List<Entry> entries = dao.selectValues(subkeyId);
Set<String> certificates = new HashSet<>();
for (Entry entry : entries) {
certificates.add(entry.getCertificate());
}
return Collections.unmodifiableSet(certificates);
} catch (SQLException e) {
throw new IOException("Cannot query for subkey lookup entries.", e);
}
}
@Override
public void storeCertificateSubkeyIds(String certificate, List<Long> subkeyIds) throws IOException {
try {
dao.insertValues(certificate, subkeyIds);
} catch (SQLException e) {
throw new IOException("Cannot store subkey lookup entries in database.", e);
}
}
}

View file

@ -4,8 +4,10 @@
package pgp.cert_d.jdbc.sqlite;
import org.sqlite.SQLiteErrorCode;
import org.sqlite.SQLiteException;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
@ -13,16 +15,9 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.sqlite.SQLiteErrorCode;
import org.sqlite.SQLiteException;
import pgp.certificate_store.SubkeyLookup;
public class SqliteSubkeyLookup implements SubkeyLookup {
public class SqliteSubkeyLookupDaoImpl implements SubkeyLookupDao {
private final String databaseUrl;
@ -41,7 +36,7 @@ public class SqliteSubkeyLookup implements SubkeyLookup {
"SELECT * FROM subkey_lookup " +
"WHERE subkey_id=?";
public SqliteSubkeyLookup(String databaseURL) throws SQLException {
public SqliteSubkeyLookupDaoImpl(String databaseURL) throws SQLException {
this.databaseUrl = databaseURL;
try (Connection connection = getConnection(); Statement statement = connection.createStatement()) {
statement.execute(CREATE_TABLE_STMT);
@ -52,17 +47,19 @@ public class SqliteSubkeyLookup implements SubkeyLookup {
return DriverManager.getConnection(databaseUrl);
}
public static SqliteSubkeyLookup forDatabaseFile(File databaseFile) throws SQLException {
return new SqliteSubkeyLookup("jdbc:sqlite:" + databaseFile.getAbsolutePath());
public static SqliteSubkeyLookupDaoImpl forDatabaseFile(File databaseFile) throws SQLException {
return new SqliteSubkeyLookupDaoImpl("jdbc:sqlite:" + databaseFile.getAbsolutePath());
}
public void insertValues(String certificate, List<Long> subkeyIds) throws SQLException {
public int insertValues(String certificate, List<Long> subkeyIds) throws SQLException {
int inserted = 0;
try (Connection connection = getConnection(); PreparedStatement statement = connection.prepareStatement(INSERT_STMT)) {
for (long subkeyId : subkeyIds) {
try {
statement.setString(1, certificate);
statement.setLong(2, subkeyId);
statement.executeUpdate();
inserted++;
} catch (SQLiteException e) {
// throw any exception, except:
// ignore unique constraint-related exceptions if we ignoreDuplicates
@ -74,6 +71,7 @@ public class SqliteSubkeyLookup implements SubkeyLookup {
}
}
}
return inserted;
}
public List<Entry> selectValues(long subkeyId) throws SQLException {
@ -92,28 +90,4 @@ public class SqliteSubkeyLookup implements SubkeyLookup {
}
return results;
}
@Override
public Set<String> getCertificatesForSubkeyId(long subkeyId) throws IOException {
try {
List<Entry> entries = selectValues(subkeyId);
Set<String> certificates = new HashSet<>();
for (Entry entry : entries) {
certificates.add(entry.getCertificate());
}
return Collections.unmodifiableSet(certificates);
} catch (SQLException e) {
throw new IOException("Cannot query for subkey lookup entries.", e);
}
}
@Override
public void storeCertificateSubkeyIds(String certificate, List<Long> subkeyIds) throws IOException {
try {
insertValues(certificate, subkeyIds);
} catch (SQLException e) {
throw new IOException("Cannot store subkey lookup entries in database.", e);
}
}
}

View file

@ -0,0 +1,15 @@
// SPDX-FileCopyrightText: 2022 Paul Schaub <vanitasvitae@fsfe.org>
//
// SPDX-License-Identifier: Apache-2.0
package pgp.cert_d.jdbc.sqlite;
import java.sql.SQLException;
import java.util.List;
public interface SubkeyLookupDao {
int insertValues(String certificate, List<Long> subkeyIds) throws SQLException;
List<Entry> selectValues(long subkeyId) throws SQLException;
}

View file

@ -23,14 +23,14 @@ import org.junit.jupiter.api.Test;
public class SqliteSubkeyLookupTest {
private File databaseFile;
private SqliteSubkeyLookup lookup;
private DatabaseSubkeyLookup lookup;
@BeforeEach
public void setupLookup() throws IOException, SQLException {
databaseFile = Files.createTempFile("pgp.cert.d-", "lookup.db").toFile();
databaseFile.createNewFile();
databaseFile.deleteOnExit();
lookup = SqliteSubkeyLookup.forDatabaseFile(databaseFile);
lookup = new DatabaseSubkeyLookup(SqliteSubkeyLookupDaoImpl.forDatabaseFile(databaseFile));
}
@Test
@ -45,8 +45,7 @@ public class SqliteSubkeyLookupTest {
}
@Test
public void getNonExistingSubkeyYieldsNull() throws IOException, SQLException {
assertTrue(lookup.selectValues(6666666).isEmpty());
public void getNonExistingSubkeyYieldsNull() throws IOException {
assertTrue(lookup.getCertificatesForSubkeyId(6666666).isEmpty());
}
@ -56,7 +55,7 @@ public class SqliteSubkeyLookupTest {
assertEquals(Collections.singleton("eb85bb5fa33a75e15e944e63f231550c4f47e38e"), lookup.getCertificatesForSubkeyId(1337));
// do the lookup using a second db instance on the same file
SqliteSubkeyLookup secondInstance = SqliteSubkeyLookup.forDatabaseFile(databaseFile);
DatabaseSubkeyLookup secondInstance = new DatabaseSubkeyLookup(SqliteSubkeyLookupDaoImpl.forDatabaseFile(databaseFile));
assertEquals(Collections.singleton("eb85bb5fa33a75e15e944e63f231550c4f47e38e"), secondInstance.getCertificatesForSubkeyId(1337));
}

View file

@ -22,7 +22,8 @@ import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
import pgp.cert_d.jdbc.sqlite.SqliteSubkeyLookup;
import pgp.cert_d.jdbc.sqlite.DatabaseSubkeyLookup;
import pgp.cert_d.jdbc.sqlite.SqliteSubkeyLookupDaoImpl;
import pgp.certificate_store.SubkeyLookup;
public class SubkeyLookupTest {
@ -37,7 +38,7 @@ public class SubkeyLookupTest {
File sqliteDatabase = Files.createTempFile("subkeyLookupTest", ".db").toFile();
sqliteDatabase.createNewFile();
sqliteDatabase.deleteOnExit();
SqliteSubkeyLookup sqliteSubkeyLookup = SqliteSubkeyLookup.forDatabaseFile(sqliteDatabase);
DatabaseSubkeyLookup sqliteSubkeyLookup = new DatabaseSubkeyLookup(SqliteSubkeyLookupDaoImpl.forDatabaseFile(sqliteDatabase));
testSubjects.add(sqliteSubkeyLookup);
}

View file

@ -11,7 +11,8 @@ import pgp.cert_d.SharedPGPCertificateDirectoryImpl;
import pgp.cert_d.cli.commands.Get;
import pgp.cert_d.cli.commands.Import;
import pgp.cert_d.cli.commands.MultiImport;
import pgp.cert_d.jdbc.sqlite.SqliteSubkeyLookup;
import pgp.cert_d.jdbc.sqlite.DatabaseSubkeyLookup;
import pgp.cert_d.jdbc.sqlite.SqliteSubkeyLookupDaoImpl;
import pgp.certificate_store.SubkeyLookup;
import pgp.certificate_store.exception.NotAStoreException;
import pgp.certificate_store.CertificateDirectory;
@ -53,7 +54,8 @@ public class PGPCertDCli {
certificateDirectory = new SharedPGPCertificateDirectoryImpl(
baseDirectory,
new CertificateReader());
subkeyLookup = SqliteSubkeyLookup.forDatabaseFile(new File(baseDirectory, "_pgpainless_subkey_map.db"));
subkeyLookup = new DatabaseSubkeyLookup(
SqliteSubkeyLookupDaoImpl.forDatabaseFile(new File(baseDirectory, "_pgpainless_subkey_map.db")));
PGPCertDCli.certificateDirectory = new SharedPGPCertificateDirectoryAdapter(certificateDirectory, subkeyLookup);
}