Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Repo info
Activity
Davis Zanot
@dzanot
Working on this issue too :point_up: I think the cause is that Async no longer extends LiftIO, thus AsyncConnectionIO no longer satisfies the requirements of LiftIO.liftK... Which leads us to the question, is there a way to get a FunctionK[IO, ConnectionIO] with the new CE3 hierarchy? (ps I think myself and others came to this solution via https://stackoverflow.com/questions/59657203/doobie-lifting-arbitrary-effect-into-connectionio)
The ultimate goal of ours is to use our Logger[F] within the ConnectionIO context
Davis Zanot
@dzanot
Hmm I may have found a solution via WeakAsync (for posterity this was answered in Discourse https://discord.com/channels/632277896739946517/632727524434247691/851530913341898853) )
Though I don't full understand WeakAsync 🤔
danveer4686
@danveer4686
Hi Team, Below code is throwing compile error:
import doobie.hikari.HikariTransactor
import doobie.util.ExecutionContexts
import cats.effect.{ Resource, Blocker}
import zio.interop.catz._
import zio.Task

object SampleDoobie {

  def dbResource: Resource[Task, HikariTransactor[Task]] = {
    for {
      connectEC <- ExecutionContexts.fixedThreadPool[Task](20)
      xa        <- HikariTransactor.newHikariTransactor[Task](
        "org.postgresql.Driver", // driver classname
        "url", // connect URL
        "db_usr", // username
        "db_pass", // password
        connectEC,                              // await connection here
        Blocker.liftExecutionContext(connectEC) // transactEC // execute JDBC operations here
      )
    } yield xa
  }
}
Below is my sbt:
scalaVersion := "2.12.10"

val doobieVersion = "1.0.0-M3"
val calibanVersion= "0.10.1"
val zhttpVersion  = "1.0.0.0-RC17"
val zioInteropVersion = "3.1.1.0"

val libs = List(
  "org.tpolecat" %% "doobie-core"     % doobieVersion ,
  "org.tpolecat" %% "doobie-postgres" % doobieVersion ,
  "org.tpolecat" %% "doobie-h2"       % doobieVersion ,
  "org.tpolecat" %% "doobie-hikari"   % doobieVersion ,

  "com.github.ghostdogpr" %% "caliban" % calibanVersion,
  "com.github.ghostdogpr" %% "caliban-zio-http" %  calibanVersion,
  "io.d11" %% "zhttp" % zhttpVersion,
  "dev.zio" %% "zio-interop-cats" % zioInteropVersion
)

libraryDependencies ++= libs
Rob Norris
@tpolecat
What is the error?
danveer4686
@danveer4686
@tpolecat
error1 in creation of connectEC: No implicits found for parameter sf: Sync[Task]
error2 in import cats.effect.Blocker
Rob Norris
@tpolecat
It sounds like something may be pulling in both CE2 and CE3.
Witold Soczek
@v-tec2706
@danveer4686 did you managed to resolve that?
1 reply
eugeniyk
@eugeniyk
Hello guys
Please suggest how to use Put[A] instances with low-level API (if I understand correctly what is LL api - we are using HC.prepareCall, setObject and other Free monads), specially with CallableStatementIO
Idea is to make method below more type safe, as I understand Put incapsulates ability to unsafely set object within Prepared statement; currently it's 0.9.2 version
  private def setParams(params: Vector[Any]): CallableStatementIO[Vector[Unit]] = {
    params.zipWithIndex.traverse[CallableStatementIO, Unit] {
      case (p, i) =>
        setObject(i + 1, p.asInstanceOf[AnyRef])
    }
  }
eugeniyk
@eugeniyk
Not sure why we don't have high-level api for CallableStatement, this looks compilable at least
write: Write[A] = ???
item: A = ???
FCS.raw(write.unsafeSet(_,  index, item))
eugeniyk
@eugeniyk
https://tpolecat.github.io/doobie/docs/12-Custom-Mappings.html#column-vector-mappings
Does Read represent scenario of multiple result set returned from multiple queries / stored procedure?
Or it's just a generalization for cases when you return back rows of different types inside (but how is it possible?)
Rob Norris
@tpolecat
Read decodes a column vector into a value.
Get decodes a single element of a column vector into a value.
Nothing in doobie's high-level API can deal with multiple resultsets. You have to use the low-level API for that.
The problem is that callable statements have in and out parameters that need to be registered, can return atomic values or cursors or other things that are lifetime-managed in a vendor-specific way and may require cleanup.
It's just so general there's not a lot you can say about the "common" use case.
eugeniyk
@eugeniyk
hm.. interesting!
Rob Norris
@tpolecat
You may be able to write something for your use case though. And you do this by building up combinators using the F* API
eugeniyk
@eugeniyk
About Read - most of the times users don't have to worry about contracting it right?
One of use-cases for [Read] customization I can see is when I have case class where I want to ignore some of fields from being selected into / updated from
and how does it work - Write[T] with autoincremented columns (say, non-updatable columns)?
Rob Norris
@tpolecat
Normally the user never sees Write. You say sql".. $foo ... $bar" and assuming foo: Int and bar: String doobie will forge a Write[Int :: String :: HNil] under the covers and that's what is used to set values for the statement parameters.
eugeniyk
@eugeniyk
Reason I'm asking - if I'm planning to use Write for calling store procedures with low level api, wonder how is better to expose the parameter types
it could be Write[()], Write[A], Write[(A, B)], .... Write22[(...)]
or just Write[A] (but then it's harder to skip non-updatable columns..)
eugeniyk
@eugeniyk

@tpolecat I've noticed that for

def getWrite[T: Write](item: T)
...
getWrite((Some(123), None)) // 1 parameter
getWrite[(Option[Int], Option[String])]((Some(123), None)) // 2 parameters

in first case it will create Write without None / null; so when I'm trying to assign value to Prepared statement or stored procedure, it won't assign second parameter
is it a well-known behavior?

Rob Norris
@tpolecat
The way to summon an instance is Write[T].
I’m surprised it works at all for None, which is probably turned into HNil which has width zero and is skipped.
Stacy Curl
@stacycurl

Helo, I’m thinking of writing a ‘doobie for aws’, unless a miracle occurs it will be a noddy project for a long time.

What would be your reaction if it were suspiciously similar to doobie ? i.e. I copy ’n’ pasted ’n’ modified lots of code from doobie ? I’m happy to use the same license, attribute doobie, etc.

Rob Norris
@tpolecat
You mean a free monad wrapper for the AWS API?
Stacy Curl
@stacycurl
Yes
Rob Norris
@tpolecat
If you’re going to generate code I suggest generating tagless style instead. It’s just a lot easier.
I think there’s a branch out there that does it. Will be named tagless something.
Stacy Curl
@stacycurl
I’m not fond of tagless
Rob Norris
@tpolecat
Ok.
Stacy Curl
@stacycurl
So is it ok if I copy liberally from doobie ? I will attribute doobie, of course.
Would you require anything else ?
IANAL and I don’t know if you can legally require stuff, but I want to be thoughtful.
Rob Norris
@tpolecat
Well in any case feel free to copy anything you like. If you want to say that portions are derived with permission from doobie that’s cool but I’m not worried about it.
Stacy Curl
@stacycurl
Thanks !
Rob Norris
@tpolecat
Sure, good luck!
Because AWS is a much bigger and much deeper API you may find that you’ll need to invent some new machinery.
Stacy Curl
@stacycurl
I’m cranking through the S3 api and it is big.
Rob Norris
@tpolecat
The basic idea of making the bottom layer map 1:1 with the underlying Java code is sound I think. Then derive safer stuff at a higher level.
It’s kept doobie relatively simple.
truongio
@truongio
Hi, is there any way to achieve this?
  def makePerson: Either[Throwable, Person] = ???
  implicit val read: Read[Person] = Read[(Long, String)].map { // I want something like .temap here
    case (age, name) => makePerson(age, name)  
  }
Swapnil S.
@Iamswapnil619

Hi ,

I have written a function to create db transactor code below using doobie hikari. :

def createTransactor(db: JDBC, pool_name: String , pool_size: Int): ZLayer[Blocking, Throwable, TransactorEnv] = ZLayer.fromManaged {
    val config = new HikariConfig()
    config.setDriverClassName(db.driver)
    config.setJdbcUrl(db.url)
    config.setUsername(db.user)
    config.setPassword(db.password)
    config.setMaximumPoolSize(pool_size)
    config.setPoolName(pool_name)
    for {
      rt <- Task.runtime.toManaged_
      transactor <- HikariTransactor.fromHikariConfig[Task](config, rt.platform.executor.asEC).toManagedZIO
    } yield transactor
  }

This code perfectly works with scala 2.12.14 but failed with scala 3.0.0 with below error :

[error] -- Error: /Users/sonawanes/Desktop/swapnil/etlflow-scala3/src/main/scala/db/Transactor.scala:29:3 
[error] 29 |  }
[error]    |   ^
[error]    |Exception occurred while executing macro expansion.
[error]    |java.lang.RuntimeException: TYPEREPR, UNSUPPORTED: class dotty.tools.dotc.core.Types$CachedRefinedType - RefinedType(AppliedType(TypeRef(ThisType(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class doobie)),object util),module class transactor$)),class Transactor),List(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class zio)),object package),type Task))),A,TypeBounds(TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class zaxxer)),object hikari),HikariDataSource),TypeRef(TermRef(ThisType(TypeRef(NoPrefix,module class zaxxer)),object hikari),HikariDataSource)))
[error]    |    at izumi.reflect.dottyreflection.Inspector.inspectTypeRepr(Inspector.scala:96)
[error]    |    at izumi.reflect.dottyreflection.Inspector.buildTypeRef(Inspector.scala:22)
[error]    |    at izumi.reflect.dottyreflection.TypeInspections$.apply(TypeInspections.scala:10)
[error]    |    at izumi.reflect.dottyreflection.Inspect$.inspectAny(Inspect.scala:17)
[error]    |
[error]    | This location contains code that was inlined from Transactor.scala:29
[error]    | This location contains code that was inlined from Tags.scala:141

Any idea what i am doing wrong here ?

Rob Norris
@tpolecat
Looks like a compiler bug.
Rob Norris
@tpolecat
Or a zio macro bug.
Rob Norris
@tpolecat
I'm no longer monitoring this channel. Please move to https://sca.la/typeleveldiscord
discobaba
@uncleweirdo_twitter