mirror of
https://github.com/bitcoin-s/bitcoin-s.git
synced 2025-03-03 18:47:38 +01:00
Create DatabaseDriver ADT instead of booleans (#1902)
This commit is contained in:
parent
13fbb3f889
commit
2c3342492c
7 changed files with 77 additions and 22 deletions
|
@ -5,6 +5,7 @@ import org.bitcoins.chain.config.ChainAppConfig
|
||||||
import org.bitcoins.core.api.chain.db.BlockHeaderDb
|
import org.bitcoins.core.api.chain.db.BlockHeaderDb
|
||||||
import org.bitcoins.core.number.{Int32, UInt32}
|
import org.bitcoins.core.number.{Int32, UInt32}
|
||||||
import org.bitcoins.crypto.DoubleSha256DigestBE
|
import org.bitcoins.crypto.DoubleSha256DigestBE
|
||||||
|
import org.bitcoins.db.DatabaseDriver.{PostgreSQL, SQLite}
|
||||||
import org.bitcoins.db._
|
import org.bitcoins.db._
|
||||||
|
|
||||||
import scala.annotation.tailrec
|
import scala.annotation.tailrec
|
||||||
|
@ -26,10 +27,9 @@ case class BlockHeaderDAO()(implicit
|
||||||
import mappers.{doubleSha256DigestBEMapper, int32Mapper, uInt32Mapper}
|
import mappers.{doubleSha256DigestBEMapper, int32Mapper, uInt32Mapper}
|
||||||
|
|
||||||
implicit private val bigIntMapper: BaseColumnType[BigInt] =
|
implicit private val bigIntMapper: BaseColumnType[BigInt] =
|
||||||
if (appConfig.driverName == "postgresql") {
|
appConfig.driver match {
|
||||||
mappers.bigIntPostgresMapper
|
case SQLite => mappers.bigIntMapper
|
||||||
} else {
|
case PostgreSQL => mappers.bigIntPostgresMapper
|
||||||
mappers.bigIntMapper
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override val table =
|
override val table =
|
||||||
|
|
|
@ -4,6 +4,7 @@ import org.bitcoins.chain.config.ChainAppConfig
|
||||||
import org.bitcoins.core.api.chain.db.CompactFilterDb
|
import org.bitcoins.core.api.chain.db.CompactFilterDb
|
||||||
import org.bitcoins.core.gcs.FilterType
|
import org.bitcoins.core.gcs.FilterType
|
||||||
import org.bitcoins.crypto.DoubleSha256DigestBE
|
import org.bitcoins.crypto.DoubleSha256DigestBE
|
||||||
|
import org.bitcoins.db.DatabaseDriver.{PostgreSQL, SQLite}
|
||||||
import org.bitcoins.db.{CRUD, SlickUtil}
|
import org.bitcoins.db.{CRUD, SlickUtil}
|
||||||
import scodec.bits.ByteVector
|
import scodec.bits.ByteVector
|
||||||
|
|
||||||
|
@ -23,10 +24,9 @@ case class CompactFilterDAO()(implicit
|
||||||
import profile.api._
|
import profile.api._
|
||||||
|
|
||||||
implicit private val bigIntMapper: BaseColumnType[BigInt] =
|
implicit private val bigIntMapper: BaseColumnType[BigInt] =
|
||||||
if (appConfig.driverName == "postgresql") {
|
appConfig.driver match {
|
||||||
mappers.bigIntPostgresMapper
|
case SQLite => mappers.bigIntMapper
|
||||||
} else {
|
case PostgreSQL => mappers.bigIntPostgresMapper
|
||||||
mappers.bigIntMapper
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class CompactFilterTable(tag: Tag)
|
class CompactFilterTable(tag: Tag)
|
||||||
|
|
|
@ -3,6 +3,7 @@ package org.bitcoins.chain.models
|
||||||
import org.bitcoins.chain.config.ChainAppConfig
|
import org.bitcoins.chain.config.ChainAppConfig
|
||||||
import org.bitcoins.core.api.chain.db.CompactFilterHeaderDb
|
import org.bitcoins.core.api.chain.db.CompactFilterHeaderDb
|
||||||
import org.bitcoins.crypto.DoubleSha256DigestBE
|
import org.bitcoins.crypto.DoubleSha256DigestBE
|
||||||
|
import org.bitcoins.db.DatabaseDriver.{PostgreSQL, SQLite}
|
||||||
import org.bitcoins.db.{CRUD, SlickUtil}
|
import org.bitcoins.db.{CRUD, SlickUtil}
|
||||||
|
|
||||||
import scala.concurrent.{ExecutionContext, Future}
|
import scala.concurrent.{ExecutionContext, Future}
|
||||||
|
@ -17,10 +18,9 @@ case class CompactFilterHeaderDAO()(implicit
|
||||||
import mappers.doubleSha256DigestBEMapper
|
import mappers.doubleSha256DigestBEMapper
|
||||||
|
|
||||||
implicit private val bigIntMapper: BaseColumnType[BigInt] =
|
implicit private val bigIntMapper: BaseColumnType[BigInt] =
|
||||||
if (appConfig.driverName == "postgresql") {
|
appConfig.driver match {
|
||||||
mappers.bigIntPostgresMapper
|
case SQLite => mappers.bigIntMapper
|
||||||
} else {
|
case PostgreSQL => mappers.bigIntPostgresMapper
|
||||||
mappers.bigIntMapper
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class CompactFilterHeaderTable(tag: Tag)
|
class CompactFilterHeaderTable(tag: Tag)
|
||||||
|
|
|
@ -3,6 +3,7 @@ package org.bitcoins.db
|
||||||
import com.typesafe.config.Config
|
import com.typesafe.config.Config
|
||||||
import org.bitcoins.chain.config.ChainAppConfig
|
import org.bitcoins.chain.config.ChainAppConfig
|
||||||
import org.bitcoins.chain.db.ChainDbManagement
|
import org.bitcoins.chain.db.ChainDbManagement
|
||||||
|
import org.bitcoins.db.DatabaseDriver._
|
||||||
import org.bitcoins.node.config.NodeAppConfig
|
import org.bitcoins.node.config.NodeAppConfig
|
||||||
import org.bitcoins.node.db.NodeDbManagement
|
import org.bitcoins.node.db.NodeDbManagement
|
||||||
import org.bitcoins.testkit.BitcoinSTestAppConfig.ProjectType
|
import org.bitcoins.testkit.BitcoinSTestAppConfig.ProjectType
|
||||||
|
@ -47,7 +48,10 @@ class DbManagementTest extends BitcoinSAsyncTest with EmbeddedPg {
|
||||||
dbConfig(ProjectType.Chain))
|
dbConfig(ProjectType.Chain))
|
||||||
val chainDbManagement = createChainDbManagement(chainAppConfig)
|
val chainDbManagement = createChainDbManagement(chainAppConfig)
|
||||||
val result = chainDbManagement.migrate()
|
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)
|
assert(result == expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,7 +60,10 @@ class DbManagementTest extends BitcoinSAsyncTest with EmbeddedPg {
|
||||||
dbConfig(ProjectType.Wallet))
|
dbConfig(ProjectType.Wallet))
|
||||||
val walletDbManagement = createWalletDbManagement(walletAppConfig)
|
val walletDbManagement = createWalletDbManagement(walletAppConfig)
|
||||||
val result = walletDbManagement.migrate()
|
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)
|
assert(result == expected)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -65,6 +72,10 @@ class DbManagementTest extends BitcoinSAsyncTest with EmbeddedPg {
|
||||||
NodeAppConfig(BitcoinSTestAppConfig.tmpDir(), dbConfig(ProjectType.Node))
|
NodeAppConfig(BitcoinSTestAppConfig.tmpDir(), dbConfig(ProjectType.Node))
|
||||||
val nodeDbManagement = createNodeDbManagement(nodeAppConfig)
|
val nodeDbManagement = createNodeDbManagement(nodeAppConfig)
|
||||||
val result = nodeDbManagement.migrate()
|
val result = nodeDbManagement.migrate()
|
||||||
assert(result == 2)
|
val expected = nodeAppConfig.driver match {
|
||||||
|
case SQLite => 2
|
||||||
|
case PostgreSQL => 2
|
||||||
|
}
|
||||||
|
assert(result == expected)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,6 +3,7 @@ package org.bitcoins.db
|
||||||
import java.nio.file.{Files, Path, Paths}
|
import java.nio.file.{Files, Path, Paths}
|
||||||
|
|
||||||
import org.bitcoins.core.util.BitcoinSLogger
|
import org.bitcoins.core.util.BitcoinSLogger
|
||||||
|
import org.bitcoins.db.DatabaseDriver._
|
||||||
import slick.basic.DatabaseConfig
|
import slick.basic.DatabaseConfig
|
||||||
import slick.jdbc.JdbcProfile
|
import slick.jdbc.JdbcProfile
|
||||||
|
|
||||||
|
@ -38,11 +39,14 @@ trait JdbcProfileComponent[+ConfigType <: AppConfig] extends BitcoinSLogger {
|
||||||
parts(1)
|
parts(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
lazy val schemaName: Option[String] =
|
lazy val schemaName: Option[String] = driver match {
|
||||||
if (driverName == "postgresql")
|
case PostgreSQL =>
|
||||||
Some(appConfig.moduleName)
|
Some(appConfig.moduleName)
|
||||||
else
|
case SQLite =>
|
||||||
None
|
None
|
||||||
|
}
|
||||||
|
|
||||||
|
lazy val driver: DatabaseDriver = DatabaseDriver.fromString(driverName)
|
||||||
|
|
||||||
lazy val username: String = dbConfig.config.getString("db.username")
|
lazy val username: String = dbConfig.config.getString("db.username")
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@ import org.bitcoins.core.wallet.keymanagement.{
|
||||||
KeyManagerInitializeError,
|
KeyManagerInitializeError,
|
||||||
KeyManagerParams
|
KeyManagerParams
|
||||||
}
|
}
|
||||||
|
import org.bitcoins.db.DatabaseDriver.{PostgreSQL, SQLite}
|
||||||
import org.bitcoins.db.{AppConfig, AppConfigFactory, JdbcProfileComponent}
|
import org.bitcoins.db.{AppConfig, AppConfigFactory, JdbcProfileComponent}
|
||||||
import org.bitcoins.keymanager.WalletStorage
|
import org.bitcoins.keymanager.WalletStorage
|
||||||
import org.bitcoins.keymanager.bip39.{BIP39KeyManager, BIP39LockedKeyManager}
|
import org.bitcoins.keymanager.bip39.{BIP39KeyManager, BIP39LockedKeyManager}
|
||||||
|
@ -157,10 +158,13 @@ case class WalletAppConfig(
|
||||||
if (walletConf.seedExists()) {
|
if (walletConf.seedExists()) {
|
||||||
val hdCoin = walletConf.defaultAccount.coin
|
val hdCoin = walletConf.defaultAccount.coin
|
||||||
val walletDB = walletConf.dbPath resolve walletConf.dbName
|
val walletDB = walletConf.dbPath resolve walletConf.dbName
|
||||||
if (walletConf.driverName == "postgresql" || Files.exists(walletDB)) {
|
walletConf.driver match {
|
||||||
|
case PostgreSQL =>
|
||||||
AccountDAO().read((hdCoin, 0)).map(_.isDefined)
|
AccountDAO().read((hdCoin, 0)).map(_.isDefined)
|
||||||
} else {
|
case SQLite =>
|
||||||
Future.successful(false)
|
if (Files.exists(walletDB))
|
||||||
|
AccountDAO().read((hdCoin, 0)).map(_.isDefined)
|
||||||
|
else Future.successful(false)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Future.successful(false)
|
Future.successful(false)
|
||||||
|
|
Loading…
Add table
Reference in a new issue