Create DatabaseDriver ADT instead of booleans (#1902)

This commit is contained in:
Ben Carman 2020-08-27 12:41:52 -05:00 committed by GitHub
parent 13fbb3f889
commit 2c3342492c
7 changed files with 77 additions and 22 deletions

View file

@ -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 =

View file

@ -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)

View file

@ -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)

View file

@ -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)
}
}

View file

@ -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")
}
}
}

View file

@ -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")

View file

@ -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)