From 2c3342492c103b68fe7ade0ff65d2ed3afd39a76 Mon Sep 17 00:00:00 2001 From: Ben Carman Date: Thu, 27 Aug 2020 12:41:52 -0500 Subject: [PATCH] Create DatabaseDriver ADT instead of booleans (#1902) --- .../chain/models/BlockHeaderDAO.scala | 8 ++--- .../chain/models/CompactFilterDAO.scala | 8 ++--- .../chain/models/CompactFilterHeaderDAO.scala | 8 ++--- .../org/bitcoins/db/DbManagementTest.scala | 17 +++++++-- .../org/bitcoins/db/DatabaseDriver.scala | 36 +++++++++++++++++++ .../bitcoins/db/JdbcProfileComponent.scala | 10 ++++-- .../wallet/config/WalletAppConfig.scala | 12 ++++--- 7 files changed, 77 insertions(+), 22 deletions(-) create mode 100644 db-commons/src/main/scala/org/bitcoins/db/DatabaseDriver.scala diff --git a/chain/src/main/scala/org/bitcoins/chain/models/BlockHeaderDAO.scala b/chain/src/main/scala/org/bitcoins/chain/models/BlockHeaderDAO.scala index c7f7b43291..8efdf9f5c1 100644 --- a/chain/src/main/scala/org/bitcoins/chain/models/BlockHeaderDAO.scala +++ b/chain/src/main/scala/org/bitcoins/chain/models/BlockHeaderDAO.scala @@ -5,6 +5,7 @@ import org.bitcoins.chain.config.ChainAppConfig import org.bitcoins.core.api.chain.db.BlockHeaderDb import org.bitcoins.core.number.{Int32, UInt32} import org.bitcoins.crypto.DoubleSha256DigestBE +import org.bitcoins.db.DatabaseDriver.{PostgreSQL, SQLite} import org.bitcoins.db._ import scala.annotation.tailrec @@ -26,10 +27,9 @@ case class BlockHeaderDAO()(implicit import mappers.{doubleSha256DigestBEMapper, int32Mapper, uInt32Mapper} implicit private val bigIntMapper: BaseColumnType[BigInt] = - if (appConfig.driverName == "postgresql") { - mappers.bigIntPostgresMapper - } else { - mappers.bigIntMapper + appConfig.driver match { + case SQLite => mappers.bigIntMapper + case PostgreSQL => mappers.bigIntPostgresMapper } override val table = diff --git a/chain/src/main/scala/org/bitcoins/chain/models/CompactFilterDAO.scala b/chain/src/main/scala/org/bitcoins/chain/models/CompactFilterDAO.scala index 6109f82ca6..59a348c9ab 100644 --- a/chain/src/main/scala/org/bitcoins/chain/models/CompactFilterDAO.scala +++ b/chain/src/main/scala/org/bitcoins/chain/models/CompactFilterDAO.scala @@ -4,6 +4,7 @@ import org.bitcoins.chain.config.ChainAppConfig import org.bitcoins.core.api.chain.db.CompactFilterDb import org.bitcoins.core.gcs.FilterType import org.bitcoins.crypto.DoubleSha256DigestBE +import org.bitcoins.db.DatabaseDriver.{PostgreSQL, SQLite} import org.bitcoins.db.{CRUD, SlickUtil} import scodec.bits.ByteVector @@ -23,10 +24,9 @@ case class CompactFilterDAO()(implicit import profile.api._ implicit private val bigIntMapper: BaseColumnType[BigInt] = - if (appConfig.driverName == "postgresql") { - mappers.bigIntPostgresMapper - } else { - mappers.bigIntMapper + appConfig.driver match { + case SQLite => mappers.bigIntMapper + case PostgreSQL => mappers.bigIntPostgresMapper } class CompactFilterTable(tag: Tag) diff --git a/chain/src/main/scala/org/bitcoins/chain/models/CompactFilterHeaderDAO.scala b/chain/src/main/scala/org/bitcoins/chain/models/CompactFilterHeaderDAO.scala index e08ffdc4b5..e008078c2f 100644 --- a/chain/src/main/scala/org/bitcoins/chain/models/CompactFilterHeaderDAO.scala +++ b/chain/src/main/scala/org/bitcoins/chain/models/CompactFilterHeaderDAO.scala @@ -3,6 +3,7 @@ package org.bitcoins.chain.models import org.bitcoins.chain.config.ChainAppConfig import org.bitcoins.core.api.chain.db.CompactFilterHeaderDb import org.bitcoins.crypto.DoubleSha256DigestBE +import org.bitcoins.db.DatabaseDriver.{PostgreSQL, SQLite} import org.bitcoins.db.{CRUD, SlickUtil} import scala.concurrent.{ExecutionContext, Future} @@ -17,10 +18,9 @@ case class CompactFilterHeaderDAO()(implicit import mappers.doubleSha256DigestBEMapper implicit private val bigIntMapper: BaseColumnType[BigInt] = - if (appConfig.driverName == "postgresql") { - mappers.bigIntPostgresMapper - } else { - mappers.bigIntMapper + appConfig.driver match { + case SQLite => mappers.bigIntMapper + case PostgreSQL => mappers.bigIntPostgresMapper } class CompactFilterHeaderTable(tag: Tag) diff --git a/db-commons-test/src/test/scala/org/bitcoins/db/DbManagementTest.scala b/db-commons-test/src/test/scala/org/bitcoins/db/DbManagementTest.scala index 516570f44a..0d436eb2b2 100644 --- a/db-commons-test/src/test/scala/org/bitcoins/db/DbManagementTest.scala +++ b/db-commons-test/src/test/scala/org/bitcoins/db/DbManagementTest.scala @@ -3,6 +3,7 @@ package org.bitcoins.db import com.typesafe.config.Config import org.bitcoins.chain.config.ChainAppConfig import org.bitcoins.chain.db.ChainDbManagement +import org.bitcoins.db.DatabaseDriver._ import org.bitcoins.node.config.NodeAppConfig import org.bitcoins.node.db.NodeDbManagement import org.bitcoins.testkit.BitcoinSTestAppConfig.ProjectType @@ -47,7 +48,10 @@ class DbManagementTest extends BitcoinSAsyncTest with EmbeddedPg { dbConfig(ProjectType.Chain)) val chainDbManagement = createChainDbManagement(chainAppConfig) val result = chainDbManagement.migrate() - val expected = if (chainAppConfig.driverName == "postgresql") 4 else 5 + val expected = chainAppConfig.driver match { + case SQLite => 5 + case PostgreSQL => 4 + } assert(result == expected) } @@ -56,7 +60,10 @@ class DbManagementTest extends BitcoinSAsyncTest with EmbeddedPg { dbConfig(ProjectType.Wallet)) val walletDbManagement = createWalletDbManagement(walletAppConfig) val result = walletDbManagement.migrate() - val expected = if (walletAppConfig.driverName == "postgresql") 6 else 8 + val expected = walletAppConfig.driver match { + case SQLite => 8 + case PostgreSQL => 6 + } assert(result == expected) } @@ -65,6 +72,10 @@ class DbManagementTest extends BitcoinSAsyncTest with EmbeddedPg { NodeAppConfig(BitcoinSTestAppConfig.tmpDir(), dbConfig(ProjectType.Node)) val nodeDbManagement = createNodeDbManagement(nodeAppConfig) val result = nodeDbManagement.migrate() - assert(result == 2) + val expected = nodeAppConfig.driver match { + case SQLite => 2 + case PostgreSQL => 2 + } + assert(result == expected) } } diff --git a/db-commons/src/main/scala/org/bitcoins/db/DatabaseDriver.scala b/db-commons/src/main/scala/org/bitcoins/db/DatabaseDriver.scala new file mode 100644 index 0000000000..22f99a8c89 --- /dev/null +++ b/db-commons/src/main/scala/org/bitcoins/db/DatabaseDriver.scala @@ -0,0 +1,36 @@ +package org.bitcoins.db + +import org.bitcoins.crypto.StringFactory + +sealed abstract class DatabaseDriver { + def shortName: String +} + +object DatabaseDriver extends StringFactory[DatabaseDriver] { + + final case object SQLite extends DatabaseDriver { + override def shortName: String = "sqlite" + } + + final case object PostgreSQL extends DatabaseDriver { + override def shortName: String = "postgres" + } + + val all: Vector[DatabaseDriver] = Vector(SQLite, PostgreSQL) + + override def fromStringOpt(str: String): Option[DatabaseDriver] = { + all.find(state => str.toLowerCase() == state.toString.toLowerCase) match { + case Some(value) => Some(value) + case None => + all.find(state => str.toLowerCase() == state.shortName.toLowerCase) + } + } + + override def fromString(string: String): DatabaseDriver = { + fromStringOpt(string) match { + case Some(state) => state + case None => + sys.error(s"Could not find a DatabaseDriver for string=$string") + } + } +} diff --git a/db-commons/src/main/scala/org/bitcoins/db/JdbcProfileComponent.scala b/db-commons/src/main/scala/org/bitcoins/db/JdbcProfileComponent.scala index defcd517b3..2d085b442d 100644 --- a/db-commons/src/main/scala/org/bitcoins/db/JdbcProfileComponent.scala +++ b/db-commons/src/main/scala/org/bitcoins/db/JdbcProfileComponent.scala @@ -3,6 +3,7 @@ package org.bitcoins.db import java.nio.file.{Files, Path, Paths} import org.bitcoins.core.util.BitcoinSLogger +import org.bitcoins.db.DatabaseDriver._ import slick.basic.DatabaseConfig import slick.jdbc.JdbcProfile @@ -38,11 +39,14 @@ trait JdbcProfileComponent[+ConfigType <: AppConfig] extends BitcoinSLogger { parts(1) } - lazy val schemaName: Option[String] = - if (driverName == "postgresql") + lazy val schemaName: Option[String] = driver match { + case PostgreSQL => Some(appConfig.moduleName) - else + case SQLite => None + } + + lazy val driver: DatabaseDriver = DatabaseDriver.fromString(driverName) lazy val username: String = dbConfig.config.getString("db.username") diff --git a/wallet/src/main/scala/org/bitcoins/wallet/config/WalletAppConfig.scala b/wallet/src/main/scala/org/bitcoins/wallet/config/WalletAppConfig.scala index 4b7ca99fe0..5409b69bab 100644 --- a/wallet/src/main/scala/org/bitcoins/wallet/config/WalletAppConfig.scala +++ b/wallet/src/main/scala/org/bitcoins/wallet/config/WalletAppConfig.scala @@ -13,6 +13,7 @@ import org.bitcoins.core.wallet.keymanagement.{ KeyManagerInitializeError, KeyManagerParams } +import org.bitcoins.db.DatabaseDriver.{PostgreSQL, SQLite} import org.bitcoins.db.{AppConfig, AppConfigFactory, JdbcProfileComponent} import org.bitcoins.keymanager.WalletStorage import org.bitcoins.keymanager.bip39.{BIP39KeyManager, BIP39LockedKeyManager} @@ -157,10 +158,13 @@ case class WalletAppConfig( if (walletConf.seedExists()) { val hdCoin = walletConf.defaultAccount.coin val walletDB = walletConf.dbPath resolve walletConf.dbName - if (walletConf.driverName == "postgresql" || Files.exists(walletDB)) { - AccountDAO().read((hdCoin, 0)).map(_.isDefined) - } else { - Future.successful(false) + walletConf.driver match { + case PostgreSQL => + AccountDAO().read((hdCoin, 0)).map(_.isDefined) + case SQLite => + if (Files.exists(walletDB)) + AccountDAO().read((hdCoin, 0)).map(_.isDefined) + else Future.successful(false) } } else { Future.successful(false)