Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
com.twitter.finagle.Mysql.scala Maven / Gradle / Ivy
package com.twitter.finagle
import com.twitter.finagle.client.{StackClient , StdStackClient , DefaultPool }
import com.twitter.finagle.mysql._
import com.twitter.finagle.mysql.transport.{Packet , TransportImpl }
import com.twitter.finagle.param.{Monitor => _, ResponseClassifier => _, ExceptionStatsHandler => _, Tracer => _, _}
import com.twitter.finagle.service.{ResponseClassifier , RetryBudget }
import com.twitter.finagle.stats.{ExceptionStatsHandler , StatsReceiver }
import com.twitter.finagle.tracing._
import com.twitter.finagle.transport.Transport
import com.twitter.util.{Duration , Monitor }
trait MysqlRichClient { self: com.twitter.finagle.Client [Request , Result ] =>
def newRichClient (dest: Name , label: String ): mysql.Client with mysql.Transactions =
mysql.Client (newClient(dest, label))
def newRichClient (dest: String ): mysql.Client with mysql.Transactions =
mysql.Client (newClient(dest))
}
object MySqlClientTracingFilter {
object Stackable extends Stack .Module1 [param.Label , ServiceFactory [Request , Result ]] {
val role = ClientTracingFilter .role
val description = "Add MySql client specific annotations to the trace"
def make (_label: param.Label , next: ServiceFactory [Request , Result ]) = {
val param.Label (label) = _label
val annotations = new AnnotatingTracingFilter [Request , Result ](
label, Annotation .ClientSend (), Annotation .ClientRecv ())
annotations andThen TracingFilter andThen next
}
}
object TracingFilter extends SimpleFilter [Request , Result ] {
def apply (request: Request , service: Service [Request , Result ]) = {
if (Trace .isActivelyTracing) {
request match {
case QueryRequest (sqlStatement) => Trace .recordBinary("mysql.query" , sqlStatement)
case PrepareRequest (sqlStatement) => Trace .recordBinary("mysql.prepare" , sqlStatement)
case ExecuteRequest (id, _, _, _) => Trace .recordBinary("mysql.execute" , id)
case _ => Trace .record("mysql." + request.getClass.getSimpleName.replace("$" , "" ))
}
}
service(request)
}
}
}
object Mysql extends com .twitter .finagle .Client [Request , Result ] with MysqlRichClient {
object param {
case class MaxConcurrentPrepareStatements (num: Int ) {
assert(num <= Int .MaxValue , s"$num is not <= Int.MaxValue bytes" )
assert(num > 0 , s"$num must be positive" )
def mk (): (MaxConcurrentPrepareStatements , Stack .Param [MaxConcurrentPrepareStatements ]) =
(this , MaxConcurrentPrepareStatements .param)
}
object MaxConcurrentPrepareStatements {
implicit val param = Stack .Param (MaxConcurrentPrepareStatements (20 ))
}
}
case class Client (
stack: Stack [ServiceFactory [Request , Result ]] = StackClient .newStack
.replace(ClientTracingFilter .role, MySqlClientTracingFilter .Stackable ),
params: Stack .Params = StackClient .defaultParams + DefaultPool .Param (
low = 0 , high = 1 , bufferSize = 0 ,
idleTime = Duration .Top ,
maxWaiters = Int .MaxValue ) +
ProtocolLibrary ("mysql" ))
extends StdStackClient [Request , Result , Client ]
with WithSessionPool [Client ]
with WithDefaultLoadBalancer [Client ]
with MysqlRichClient {
protected def copy1 (
stack: Stack [ServiceFactory [Request , Result ]] = this .stack,
params: Stack .Params = this .params
): Client = copy(stack, params)
protected type In = Packet
protected type Out = Packet
protected def newTransporter () = params[TransportImpl ].transporter(params)
protected def newDispatcher (transport: Transport [Packet , Packet ]): Service [Request , Result ] = {
val param.MaxConcurrentPrepareStatements (num) = params[param.MaxConcurrentPrepareStatements ]
mysql.ClientDispatcher (transport, Handshake (params), num)
}
def withMaxConcurrentPrepareStatements (num: Int ): Client =
configured(param.MaxConcurrentPrepareStatements (num))
def withCredentials (u: String , p: String ): Client =
configured(Handshake .Credentials (Option (u), Option (p)))
def withDatabase (db: String ): Client =
configured(Handshake .Database (Option (db)))
def withCharset (charset: Short ): Client =
configured(Handshake .Charset (charset))
override val withSessionPool: SessionPoolingParams [Client ] =
new SessionPoolingParams (this )
override val withLoadBalancer: DefaultLoadBalancingParams [Client ] =
new DefaultLoadBalancingParams (this )
override val withTransport: ClientTransportParams [Client ] =
new ClientTransportParams (this )
override val withSession: ClientSessionParams [Client ] =
new ClientSessionParams (this )
override val withSessionQualifier: SessionQualificationParams [Client ] =
new SessionQualificationParams (this )
override val withAdmissionControl: ClientAdmissionControlParams [Client ] =
new ClientAdmissionControlParams (this )
override def withLabel (label: String ): Client = super .withLabel(label)
override def withStatsReceiver (statsReceiver: StatsReceiver ): Client =
super .withStatsReceiver(statsReceiver)
override def withMonitor (monitor: Monitor ): Client = super .withMonitor(monitor)
override def withTracer (tracer: Tracer ): Client = super .withTracer(tracer)
override def withExceptionStatsHandler (exceptionStatsHandler: ExceptionStatsHandler ): Client =
super .withExceptionStatsHandler(exceptionStatsHandler)
override def withRequestTimeout (timeout: Duration ): Client =
super .withRequestTimeout(timeout)
override def withResponseClassifier (responseClassifier: ResponseClassifier ): Client =
super .withResponseClassifier(responseClassifier)
override def withRetryBudget (budget: RetryBudget ): Client = super .withRetryBudget(budget)
override def withRetryBackoff (backoff: Stream [Duration ]): Client = super .withRetryBackoff(backoff)
override def configured [P ](psp: (P , Stack .Param [P ])): Client = super .configured(psp)
override def filtered (filter: Filter [Request , Result , Request , Result ]): Client =
super .filtered(filter)
}
val client = Client ()
def newClient (dest: Name , label: String ): ServiceFactory [Request , Result ] =
client.newClient(dest, label)
def newService (dest: Name , label: String ): Service [Request , Result ] =
client.newService(dest, label)
@deprecated ("Use client.withCredentials" , "6.22.0" )
def withCredentials (u: String , p: String ): Client =
client.configured(Handshake .Credentials (Option (u), Option (p)))
@deprecated ("Use client.withDatabase" , "6.22.0" )
def withDatabase (db: String ): Client =
client.configured(Handshake .Database (Option (db)))
@deprecated ("Use client.withCharset" , "6.22.0" )
def withCharset (charset: Short ): Client =
client.configured(Handshake .Charset (charset))
@deprecated ("Use client.configured" , "6.22.0" )
def configured [P : Stack .Param ](p: P ): Client =
client.configured(p)
}