Movatterモバイル変換


[0]ホーム

URL:


{-# LANGUAGE CPP #-}modulePostgreSQL.Binary.Encoder(run,-- * Value encoderEncoder,int2_int16,int2_word16,int4_int32,int4_word32,int8_int64,int8_word64,float4,float8,composite,bool,numeric,uuid,json_ast,json_bytes,jsonb_ast,jsonb_bytes,char,text_strict,text_lazy,bytea_strict,bytea_lazy,date,time_int,time_float,timetz_int,timetz_float,timestamp_int,timestamp_float,timestamptz_int,timestamptz_float,interval_int,interval_float,hstore,hstoreRep,array,-- * Array encoderArrayEncoder,arrayValue,arrayNullableValue,arrayDimension,arrayRep,-- * Enumenum,)whereimportPostgreSQL.Binary.Preludehiding(take,bool,maybe)importData.ByteString.Builder(Builder)importqualifiedData.ByteString.BuilderasBuilderimportqualifiedData.ByteStringasByteStringimportqualifiedData.ByteString.LazyasLazyByteStringimportqualifiedData.TextasTextimportqualifiedData.Text.EncodingasTextimportqualifiedData.Text.LazyasLazyTextimportqualifiedData.Text.Lazy.EncodingasLazyTextimportqualifiedData.VectorasVectorimportqualifiedData.ScientificasScientificimportqualifiedData.AesonasAesonimportqualifiedData.UUIDasUUIDimportqualifiedPostgreSQL.Binary.DataasDataimportqualifiedPostgreSQL.Binary.IntegralasIntegralimportqualifiedPostgreSQL.Binary.NumericasNumericimportqualifiedPostgreSQL.Binary.TimeasTimeimportqualifiedPostgreSQL.Binary.IntervalasIntervalimportqualifiedPostgreSQL.Binary.BuilderPrimasBuilderPrimimportqualifiedControl.FoldlasFoldltypeEncodera=a->Builder{-# INLINE run #-}run::Encodera->a->ByteStringrunencoder=LazyByteString.toStrict.Builder.toLazyByteString.encoder{-# INLINE tuple2 #-}tuple2::Encodera->Encoderb->Encoder(a,b)tuple2e1e2=\(v1,v2)->e1v1<>e2v2{-# INLINE tuple3 #-}tuple3::Encodera->Encoderb->Encoderc->Encoder(a,b,c)tuple3e1e2e3=\(v1,v2,v3)->e1v1<>e2v2<>e3v3{-# INLINE tuple4 #-}tuple4::Encodera->Encoderb->Encoderc->Encoderd->Encoder(a,b,c,d)tuple4e1e2e3e4=\(v1,v2,v3,v4)->e1v1<>e2v2<>e3v3<>e4v4{-# INLINE premap #-}premap::(a->b)->Encoderb->Encoderapremapfe=e.f{-# INLINE int2_int16 #-}int2_int16::EncoderInt16int2_int16=Builder.int16BE{-# INLINE int2_word16 #-}int2_word16::EncoderWord16int2_word16=Builder.word16BE{-# INLINE int4_int32 #-}int4_int32::EncoderInt32int4_int32=Builder.int32BE{-# INLINE int4_word32 #-}int4_word32::EncoderWord32int4_word32=Builder.word32BE{-# INLINE int4_int #-}int4_int::EncoderIntint4_int=int4_int32.fromIntegral{-# INLINE int8_int64 #-}int8_int64::EncoderInt64int8_int64=Builder.int64BE{-# INLINE int8_word64 #-}int8_word64::EncoderWord64int8_word64=Builder.word64BE{-# INLINE float4 #-}float4::EncoderFloatfloat4=int4_int32.unsafeCoerce{-# INLINE float8 #-}float8::EncoderDoublefloat8=int8_int64.unsafeCoerce{-# INLINE null4 #-}null4::ByteStringBuildernull4=Builder.string7"\255\255\255\255"{-# INLINABLE composite #-}composite::EncoderData.Compositecompositevector=int4_int(Vector.lengthvector)<>foldMapcomponentvectorwherecomponent(oid,theContent)=int4_word32oid<>contenttheContent{-# INLINABLE content #-}content::EncoderData.Contentcontent=\caseNothing->null4Justcontent->int4_int(ByteString.lengthcontent)<>Builder.byteStringcontent{-# INLINABLE maybe #-}maybe::Encodera->Encoder(Maybea)maybeencoder=\caseNothing->null4Justvalue->runencodervalue&\bytes->int4_int(ByteString.lengthbytes)<>Builder.byteStringbytes{-# INLINE bool #-}bool::EncoderBoolbool=\caseTrue->Builder.word81False->Builder.word80{-# INLINABLE numeric #-}numeric::EncoderScientificnumericx=int2_int16(fromIntegralcomponentsAmount)<>int2_int16(fromIntegralpointIndex)<>int2_word16signCode<>int2_int16(fromIntegraltrimmedExponent)<>foldMapint2_int16componentswherecomponentsAmount=lengthcomponentscoefficient=Scientific.coefficientxexponent=Scientific.base10Exponentxcomponents=Numeric.extractComponentstunedCoefficientpointIndex=componentsAmount+(tunedExponent`div`4)-1(tunedCoefficient,tunedExponent)=casemodexponent4of0->(coefficient,exponent)x->(coefficient*10^x,exponent-x)trimmedExponent=iftunedExponent>=0then0elsenegatetunedExponentsignCode=ifcoefficient<0thenNumeric.negSignCodeelseNumeric.posSignCode{-# INLINABLE uuid #-}uuid::EncoderUUIDuuid=premapUUID.toWords(tuple4int4_word32int4_word32int4_word32int4_word32){-# INLINABLE json_ast #-}json_ast::EncoderAeson.Value#if MIN_VERSION_aeson(0,10,0)json_ast=Aeson.fromEncoding.Aeson.toEncoding#elsejson_ast=Builder.lazyByteString.Aeson.encode#endif{-# INLINABLE json_bytes #-}json_bytes::EncoderByteStringjson_bytes=Builder.byteString{-# INLINABLE jsonb_ast #-}jsonb_ast::EncoderAeson.Valuejsonb_ast=\x->"\1"<>json_astx{-# INLINABLE jsonb_bytes #-}jsonb_bytes::EncoderByteStringjsonb_bytes=\x->"\1"<>Builder.byteStringx-- * Text--------------------------- |-- A UTF-8-encoded char.---- Note that since it's UTF-8-encoded-- not the \"char\" but the \"text\" OID should be used with it.{-# INLINABLE char #-}char::EncoderCharchar=Builder.charUtf8{-# INLINABLE text_strict #-}text_strict::EncoderTexttext_strict=Text.encodeUtf8BuilderEscapedBuilderPrim.nullByteIgnoringBoundedPrim{-# INLINABLE text_lazy #-}text_lazy::EncoderLazyText.Texttext_lazy=LazyText.encodeUtf8BuilderEscapedBuilderPrim.nullByteIgnoringBoundedPrim{-# INLINABLE bytea_strict #-}bytea_strict::EncoderByteStringbytea_strict=Builder.byteString{-# INLINABLE bytea_lazy #-}bytea_lazy::EncoderLazyByteString.ByteStringbytea_lazy=Builder.lazyByteString-- * Date and Time-------------------------{-# INLINABLE date #-}date::EncoderDaydate=int4_int32.fromIntegral.Time.dayToPostgresJulian{-# INLINABLE time_int #-}time_int::EncoderTimeOfDaytime_int(TimeOfDayhms)=letp=unsafeCoerces::Integeru=p`div`(10^6)inint8_int64(fromIntegralu+10^6*60*(fromIntegralm+60*fromIntegralh)){-# INLINABLE time_float #-}time_float::EncoderTimeOfDaytime_float(TimeOfDayhms)=letp=unsafeCoerces::Integeru=p`div`(10^6)infloat8(fromIntegralu/10^6+60*(fromIntegralm+60*(fromIntegralh))){-# INLINABLE timetz_int #-}timetz_int::Encoder(TimeOfDay,TimeZone)timetz_int(timeX,tzX)=time_inttimeX<>tztzX{-# INLINABLE timetz_float #-}timetz_float::Encoder(TimeOfDay,TimeZone)timetz_float(timeX,tzX)=time_floattimeX<>tztzX{-# INLINE tz #-}tz::EncoderTimeZonetz=int4_int.(*60).negate.timeZoneMinutes{-# INLINABLE timestamp_int #-}timestamp_int::EncoderLocalTimetimestamp_int=int8_int64.Time.localTimeToMicros{-# INLINABLE timestamp_float #-}timestamp_float::EncoderLocalTimetimestamp_float=float8.Time.localTimeToSecs{-# INLINABLE timestamptz_int #-}timestamptz_int::EncoderUTCTimetimestamptz_int=int8_int64.Time.utcToMicros{-# INLINABLE timestamptz_float #-}timestamptz_float::EncoderUTCTimetimestamptz_float=float8.Time.utcToSecs{-# INLINABLE interval_int #-}interval_int::EncoderDiffTimeinterval_intx=Builder.int64BEu<>Builder.int32BEd<>Builder.int32BEmwhereInterval.Intervaludm=fromMaybe(error("Too large DiffTime value for an interval "<>showx))$Interval.fromDiffTimex{-# INLINABLE interval_float #-}interval_float::EncoderDiffTimeinterval_floatx=Builder.doubleBEs<>Builder.int32BEd<>Builder.int32BEmwhereInterval.Intervaludm=fromMaybe(error("Too large DiffTime value for an interval "<>showx))$Interval.fromDiffTimexs=fromIntegralu/(10^6)-- * Array-------------------------newtypeArrayEncodera=ArrayEncoder(a->(Builder,[Int32],Bool)){-# INLINABLE array #-}array::Word32->ArrayEncodera->Encoderaarrayoid(ArrayEncoderencoder)=\value->let(valuesBuilder,dimensions,nulls)=encodervalue(dimensionsAmount,dimensionsBuilder)=letstep(amount,builder)dimension=(succamount,builder<>Builder.int32BEdimension<>Builder.word32BE1)init=(0,mempty)infoldl'stepinitdimensionsnullsBuilder=Builder.word32BE(ifnullsthen1else0)inBuilder.word32BEdimensionsAmount<>nullsBuilder<>Builder.word32BEoid<>dimensionsBuilder<>valuesBuilder{-# INLINABLE arrayValue #-}arrayValue::Encodera->ArrayEncoderaarrayValueencoder=ArrayEncoder$\value->letbytes=runencodervaluebuilder=Builder.word32BE(fromIntegral(ByteString.lengthbytes))<>Builder.byteStringbytesin(builder,[],False){-# INLINABLE arrayNullableValue #-}arrayNullableValue::Encodera->ArrayEncoder(Maybea)arrayNullableValueencoder=ArrayEncoder$\caseNothing->(int4_int32(-1),[],True)Justvalue->letbytes=runencodervaluebuilder=Builder.word32BE(fromIntegral(ByteString.lengthbytes))<>Builder.byteStringbytesin(builder,[],False){-# INLINABLE arrayDimension #-}arrayDimension::(foralla.(a->b->a)->a->c->a)->ArrayEncoderb->ArrayEncodercarrayDimensionfoldl(ArrayEncoderencoder)=ArrayEncoder$\value->letstep(builder,_,length,nulls)value=let(valueBuilder,valueDimensions,valueNulls)=encodervaluein(builder<>valueBuilder,valueDimensions,succlength,nulls||valueNulls)init=(mempty,[],0,False)(foldedBuilder,foldedDimensions,foldedLength,foldedNulls)=foldlstepinitvalueresultDimensions=foldedLength:foldedDimensionsin(foldedBuilder,resultDimensions,foldedNulls)-- * Array rep-------------------------{-# INLINABLE arrayRep #-}arrayRep::EncoderData.ArrayarrayRep(dimensionsV,valuesV,nullsV,oidV)=dimensionsLength<>nulls<>oid<>dimensions<>valueswheredimensionsLength=int4_word32$fromIntegral$Vector.lengthdimensionsVnulls=int4_word32$ifnullsVthen1else0oid=int4_word32oidVdimensions=foldMapdimensiondimensionsVvalues=foldMapvaluevaluesVdimension(w,l)=int4_word32w<>int4_word32lvalue=\caseNothing->int4_int32(-1)Justb->int4_int32(fromIntegral(ByteString.lengthb))<>Builder.byteStringb-- * HStore--------------------------- |-- A polymorphic in-place @HSTORE@ encoder.---- Accepts:---- * An implementation of the @foldl@ function-- (e.g., @Data.Foldable.'foldl''@),-- which determines the input value.---- Here's how you can use it to produce a specific encoder:---- @-- hashMapHStore :: Encoder (Data.HashMap.Strict.HashMap Text (Maybe Text))-- hashMapHStore =--   hstore foldl'-- @--{-# INLINABLE hstore #-}hstore::(foralla.(a->(Text,MaybeText)->a)->a->b->a)->Encoderbhstorefoldl=fold&\(Foldl.Foldstepinitfin)->fin.foldlstepinitwherefold=(<>)<$>componentsAmount<*>componentswherecomponentsAmount=fmapint4_intFoldl.lengthcomponents=Foldl.foldMapcomponentBuilderidwherecomponentBuilder(key,value)=text_strictkey<>maybetext_strictvalue{-# INLINABLE hstoreRep #-}hstoreRep::EncoderData.HStorehstoreRepvector=int4_int32(fromIntegral(Vector.lengthvector))<>foldMapcomponentvectorwherecomponent(key,value)=Builder.byteStringkey<>contentvalue-- * Enum--------------------------- |-- Given a function,-- which maps the value into the textual enum label from the DB side,-- produces an encoder of that value--{-# INLINE enum #-}enum::(a->Text)->EncoderaenumasText=text_strict.asText

[8]ページ先頭

©2009-2025 Movatter.jp