com.digitalasset.canton.config.RequireTypes
LengthLimitedString
Companion object LengthLimitedString
sealed trait LengthLimitedString extends AbstractLengthLimitedString
This trait wraps a String that is limited to a certain maximum length.
Classes implementing this trait expose create
and tryCreate
methods to safely (and non-safely) construct
such a String.
The canonical use case for LengthLimitedStrings is ensuring that we don't write too long strings into the database:
Oracle has a length-limit of 1000 Unicode characters for the ordinary String type NVARCHAR2
and we are trying to avoid
the use of CLOB (as it has pitfalls regarding implicits).
This validation generally occurs on the server side and not on the client side. Concretely, this means that the
Admin API and Ledger API gRPC services is the point where we validate that the received Protobuf Strings are not too long
(and convert them into LengthLimitedStrings). On the client side, e.g. at the console, we generally take normal String types.
The console command set_display_name
and service com.digitalasset.canton.participant.admin.grpc.GrpcPartyNameManagementService
validating request.displayName
illustrate this.
As a rule of thumb: whenever you want to create a column that uses a NVARCHAR2 in Oracle, the value you write to it should use a LengthLimitedString.
Some more background on the Oracle issues: NVARCHAR and NVARCHAR2 have both by default a 4000 byte limit, but unicode uses 4-bytes per character (and nvarchar2 uses unicode) Therefore, NVARCHAR has a limit of 4000 and NVARCHAR2 has a limit of 1000 characters If need be, we can extend this to 32 KB by setting the Oracle database string size to 'extended mode' (ALTER SYSTEM SET MAX_STRING_SIZE=EXTENDED)
For longer strings, directly inherit from AbstractLengthLimitedString.
- Alphabetic
- By Inheritance
- LengthLimitedString
- AbstractLengthLimitedString
- NoCopy
- AnyRef
- Any
- Hide All
- Show All
- Public
- Protected
Abstract Value Members
- abstract def maxLength: Int
Maximum number of characters allowed.
Maximum number of characters allowed.
Must not be confused with storage space, which can be up to 4*maxLength in a UTF8 encoding
- Definition Classes
- AbstractLengthLimitedString
- abstract def str: String
- Definition Classes
- AbstractLengthLimitedString
Concrete Value Members
- final def !=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def ##: Int
- Definition Classes
- AnyRef → Any
- final def ==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
- final def asInstanceOf[T0]: T0
- Definition Classes
- Any
- def canEqual(a: Any): Boolean
- Definition Classes
- AbstractLengthLimitedString
- Annotations
- @SuppressWarnings()
- def clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.CloneNotSupportedException]) @native() @HotSpotIntrinsicCandidate()
- def copy(nothing: Nothing): Nothing
- Attributes
- protected
- Definition Classes
- NoCopy
- final def eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def equals(that: Any): Boolean
- Definition Classes
- AbstractLengthLimitedString → AnyRef → Any
- final def getClass(): Class[_ <: AnyRef]
- Definition Classes
- AnyRef → Any
- Annotations
- @native() @HotSpotIntrinsicCandidate()
- def hashCode(): Int
- Definition Classes
- AbstractLengthLimitedString → AnyRef → Any
- final def isInstanceOf[T0]: Boolean
- Definition Classes
- Any
- def name: Option[String]
- Definition Classes
- AbstractLengthLimitedString
- final def ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
- def nonEmpty: Boolean
- Definition Classes
- AbstractLengthLimitedString
- final def notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native() @HotSpotIntrinsicCandidate()
- final def notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native() @HotSpotIntrinsicCandidate()
- final def synchronized[T0](arg0: => T0): T0
- Definition Classes
- AnyRef
- def toProtoPrimitive: String
- Definition Classes
- AbstractLengthLimitedString
- def toString(): String
- Definition Classes
- AbstractLengthLimitedString → AnyRef → Any
- def tryConcatenate(that: String): LengthLimitedStringVar
- def tryConcatenate(that: LengthLimitedString): LengthLimitedStringVar
- def unwrap: String
- Definition Classes
- AbstractLengthLimitedString
- final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])
- final def wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException]) @native()
- final def wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws(classOf[java.lang.InterruptedException])