These are chat archives for scalikejdbc/ja

24th
Oct 2014
この発言に reply する形でいくつか書いてるんですが、それも読んでもらってご意見あればフィードバックください。私はすぐに何かしらを入れるとまでは考えてないです。Try 自体が微妙みたいな話はあるけど、一方であれは例外が発生しうる状況に対するものではあるので localTx との関係は考えてみてもよい気はします。
Manabu Nakamura
@gakuzzzz
Oct 24 2014 01:05

futureLocalTx が存在してるので

  def tryLocalTx[A](execution: DBSession => A)(implicit context: CPContext = NoCPContext): Try[A]
  def eitherLocalTx[E, A](execution: DBSession => Either[E, A])(implicit context: CPContext = NoCPContext): Either[E, A] // Left だったら rollback

みたいなの が DB にあってもいい気がしますね。

KAWACHI Takashi
@tkawachi
Oct 24 2014 01:06
Try {DB.localTx { }} でいいのでは..?
Toshiyuki Takahashi
@tototoshi
Oct 24 2014 01:06
本体に入れるのは変な気がする
tryLocalTx と eitherLocalTx が2つあったらそこでまた混乱しそう...
Manabu Nakamura
@gakuzzzz
Oct 24 2014 01:07
try はそれで十分そう。 readOnly とかいっぱいあると足すの面倒だし。
either で Left で rollback みたいなニーズはあるのかな?
KAWACHI Takashi
@tkawachi
Oct 24 2014 01:09
「相性が悪い」ってどういう意味なのだろう?
Toshiyuki Takahashi
@tototoshi
Oct 24 2014 01:10
Try も Either も標準だからって特別視するほどすばらしいもの(と捉えられてない)のがびみょいなあ
Manabu Nakamura
@gakuzzzz
Oct 24 2014 01:10
もうちょっと元の情報が知りたい感はありますね。 localTx(s => Try{ ... } ) で Failure なら rollback して欲しいとかなのかな
KAWACHI Takashi
@tkawachi
Oct 24 2014 01:11
えー、それこそ Try { localTx {... でいいような
Toshiyuki Takahashi
@tototoshi
Oct 24 2014 01:13
一応がくぞさんの言ってるユースケースはありそう
Manabu Nakamura
@gakuzzzz
Oct 24 2014 01:21
まとめると tryLocalTx は微妙。 eitherLocalTx はワンチャンあるって感じですかね

元々 def foo(a: A): Try[B] みたいなメソッドとかあって、

DB.localTx { implicit s
  A.findById(10).foo
}

みたいな事がしたい場合には 簡単に Try {DB.localTx { }} に書き換えられない っていうのはあるかも

KAWACHI Takashi
@tkawachi
Oct 24 2014 01:24
なるほど..
Kazuhiro Sera
@seratch
Oct 24 2014 01:34
私はこれなんだろうと勝手に理解していた> localTx(s => Try{ ... } ) で Failure なら rollback して欲しい
ご本人にココ見てって言ってみます。
Manabu Nakamura
@gakuzzzz
Oct 24 2014 02:13
Abortable[A] みたいな 型クラスうけとれる localTx つくって Future も Either も Try も共通化する、的なのとか。 ExecutionContext が渡せないかな
Manabu Nakamura
@gakuzzzz
Oct 24 2014 07:06
localTx だけだけど、書いてみた
scalikejdbc/scalikejdbc@cf83af7
SHOGO
@shogogg
Oct 24 2014 08:53
失礼します。困っていたのはまさにこれです > localTx(s => Try{ ... } ) で Failure なら rollback して欲しい
Manabu Nakamura
@gakuzzzz
Oct 24 2014 10:54

readOnlyWithConnection を readOnly 使わずに独自で書いてるのはFunction1の生成を抑制するためですか?

def readOnlyWithConnection[A](execution: Connection => A): A =
    readOnly(s => execution(s.conn))

みたく書きたいのですがまずいでしょうか

Manabu Nakamura
@gakuzzzz
Oct 24 2014 11:26
scalikejdbc/scalikejdbc#300
とりあえず指摘もらった所を変更してPRしました。
KAWACHI Takashi
@tkawachi
Oct 24 2014 12:16
https://github.com/scalikejdbc/scalikejdbc/pull/300/files#diff-e704819efb238e21b87f713de388db5aR266 ここ catch NonFatal のほうがよかったりするのかな?
Manabu Nakamura
@gakuzzzz
Oct 24 2014 12:20
good point!
KAWACHI Takashi
@tkawachi
Oct 24 2014 12:21
ControlThrowable が気になったんですが、あれって break したいときとか昔の actor でつかわれてましたよね。他にも使われてるのかな?
Manabu Nakamura
@gakuzzzz
Oct 24 2014 12:21
def findById(id: Int): Foo = {
  DB.localTx { implicit s =>
    ...
    if (...) return DummyFoo
    ...
  }
}
KAWACHI Takashi
@tkawachi
Oct 24 2014 12:21
あ、それも?
Manabu Nakamura
@gakuzzzz
Oct 24 2014 12:22
とかした時 rollback されちゃうのはイケてない感ありますね。
catch NonFatal の方がよさそう
Manabu Nakamura
@gakuzzzz
Oct 24 2014 12:29
あ、ちがうな。 Connection close は 何だろうが close しないとだめだ
rollbackIfThrowable の方で分岐すべきですね
KAWACHI Takashi
@tkawachi
Oct 24 2014 12:31
例外難しいです ><
Manabu Nakamura
@gakuzzzz
Oct 24 2014 12:41
修正 push してみた
KAWACHI Takashi
@tkawachi
Oct 24 2014 12:47
:+1:
Manabu Nakamura
@gakuzzzz
Oct 24 2014 15:49
あら coreだけテストしてたら interpolation の binary compati でエラーになってる……