factory.scala
来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 251 行
SCALA
251 行
/* __ *\** ________ ___ / / ___ Scala API **** / __/ __// _ | / / / _ | (c) 2003-2006, LAMP/EPFL **** __\ \/ /__/ __ |/ /__/ __ | **** /____/\___/_/ |_/____/_/ | | **** |/ **\* */// $Id:Factory.scala 6853 2006-03-20 16:58:47 +0100 (Mon, 20 Mar 2006) dubochet $package scala.dbc.datatype;import java.sql.Types._;import java.math.BigInteger;import java.math.BigDecimal;object Factory { final val java_lang_Integer_SIZE = 32; final val java_lang_Long_SIZE = 64; /** Returns a mullable property formated as a boolean option */ def isNullable (metadata:java.sql.ResultSetMetaData, index:Int): Option[scala.Boolean] = metadata.isNullable(index) match { case java.sql.ResultSetMetaData.columnNoNulls => Some(false); case java.sql.ResultSetMetaData.columnNullable => Some(true); case java.sql.ResultSetMetaData.columnNullableUnknown => None; } /** Returns the binary precision for an integer field. This should only be * used to find precision for integer numbers. It assumes that * bytes cannot be used partially (result % 8 = 0). */ def bytePrecision (precision:Int, signed:scala.Boolean, safe:scala.Boolean): Int = { val decimalPrecision = precision + (if (safe) 1 else 0); Pair(signed,decimalPrecision) match { case Pair(_,0) => java.lang.Integer.MAX_VALUE // That's a bit of a hack. case Pair(_,dp) if (dp <= 3) => 8 case Pair(_,dp) if (dp <= 5) => 16 case Pair(true,dp) if (dp <= 7) => 24 case Pair(false,dp) if (dp <= 8) => 24 case Pair(_,dp) if (dp <= 10) => 32 case Pair(true,dp) if (dp <= 12) => 40 case Pair(false,dp) if (dp <= 13) => 40 case Pair(_,dp) if (dp <= 15) => 48 case Pair(_,dp) if (dp <= 17) => 56 case Pair(true,dp) if (dp <= 19) => 64 case Pair(false,dp) if (dp <= 20) => 64 case Pair(_,dp) if (dp <= 22) => 72 case Pair(true,dp) if (dp <= 24) => 80 case Pair(false,dp) if (dp <= 25) => 80 case Pair(_,dp) if (dp <= 27) => 88 case Pair(_,dp) if (dp <= 29) => 96 case Pair(_,dp) if (dp <= 32) => 104 case Pair(_,dp) if (dp <= 34) => 112 case Pair(true,dp) if (dp <= 36) => 120 case Pair(false,dp) if (dp <= 37) => 120 case Pair(_,dp) if (dp <= 39) => 128 case _ => java.lang.Integer.MAX_VALUE } } def create (metadata:java.sql.ResultSetMetaData, index:Int): DataType = { metadata.getColumnType(index) match { /* Boolean data types. */ case BOOLEAN => new datatype.Boolean { override val nullable = isNullable(metadata,index); } case BIT => new datatype.Boolean { override val nullable = isNullable(metadata,index); } /* Fixed precision numeric data types. */ case DECIMAL => { Pair(bytePrecision(metadata.getPrecision(index),metadata.isSigned(index),true),metadata.getScale(index) == 0) match { case Pair(bp,true) if (bp <= java_lang_Integer_SIZE) => new datatype.ExactNumeric[Int](DataType.INT) { override val nullable = isNullable(metadata,index); val precisionRadix = 10; val precision = metadata.getPrecision(index); val signed = metadata.isSigned(index); val scale = metadata.getScale(index); } case Pair(bp,true) if (bp <= java_lang_Long_SIZE) => new datatype.ExactNumeric[Long](DataType.LONG) { override val nullable = isNullable(metadata,index); val precisionRadix = 10; val precision = metadata.getPrecision(index); val signed = metadata.isSigned(index); val scale = metadata.getScale(index); } case Pair(_,true) => new datatype.ExactNumeric[BigInteger](DataType.BIG_INTEGER) { override val nullable = isNullable(metadata,index); val precisionRadix = 10; val precision = metadata.getPrecision(index); val signed = metadata.isSigned(index); val scale = metadata.getScale(index); } case Pair(_,false) => new datatype.ExactNumeric[BigDecimal](DataType.BIG_DECIMAL) { override val nullable = isNullable(metadata,index); val precisionRadix = 10; val precision = metadata.getPrecision(index); val signed = metadata.isSigned(index); val scale = metadata.getScale(index); } } } case NUMERIC => { Pair(bytePrecision(metadata.getPrecision(index),metadata.isSigned(index),true),metadata.getScale(index) == 0) match { case Pair(bp,true) if (bp <= java_lang_Integer_SIZE) => new datatype.ExactNumeric[Int](DataType.INT) { override val nullable = isNullable(metadata,index); val precisionRadix = 10; val precision = metadata.getPrecision(index); val signed = metadata.isSigned(index); val scale = metadata.getScale(index); } case Pair(bp,true) if (bp <= java_lang_Long_SIZE) => new datatype.ExactNumeric[Long](DataType.LONG) { override val nullable = isNullable(metadata,index); val precisionRadix = 10; val precision = metadata.getPrecision(index); val signed = metadata.isSigned(index); val scale = metadata.getScale(index); } case Pair(_,true) => new datatype.ExactNumeric[BigInteger](DataType.BIG_INTEGER) { override val nullable = isNullable(metadata,index); val precisionRadix = 10; val precision = metadata.getPrecision(index); val signed = metadata.isSigned(index); val scale = metadata.getScale(index); } case Pair(_,false) => new datatype.ExactNumeric[BigDecimal](DataType.BIG_DECIMAL) { override val nullable = isNullable(metadata,index); val precisionRadix = 10; val precision = metadata.getPrecision(index); val signed = metadata.isSigned(index); val scale = metadata.getScale(index); } } } /* Fixed precision integer data types. */ case BIGINT => new datatype.ExactNumeric[Long](DataType.LONG) { override val nullable = isNullable(metadata,index); val precisionRadix = 2; val precision = 64; val signed = metadata.isSigned(index); val scale = 0; } case INTEGER => new datatype.ExactNumeric[Int](DataType.INT) { override val nullable = isNullable(metadata,index); val precisionRadix = 2; val precision = 32; val signed = metadata.isSigned(index); val scale = 0; } case SMALLINT => new datatype.ExactNumeric[Short](DataType.SHORT) { override val nullable = isNullable(metadata,index); val precisionRadix = 2; val precision = 16; val signed = metadata.isSigned(index); val scale = 0; } case TINYINT => new datatype.ExactNumeric[Byte](DataType.BYTE) { override val nullable = isNullable(metadata,index); val precisionRadix = 2; val precision = 8; val signed = metadata.isSigned(index); val scale = 0; } /* Floating point numeric data types. */ case REAL => new datatype.ApproximateNumeric[Float](DataType.FLOAT) { override val nullable = isNullable(metadata,index); val precisionRadix = 2; val precision = 64; val signed = metadata.isSigned(index); } case DOUBLE => new datatype.ApproximateNumeric[Double](DataType.DOUBLE) { override val nullable = isNullable(metadata,index); val precisionRadix = 2; val precision = 128; val signed = metadata.isSigned(index); } case FLOAT => new datatype.ApproximateNumeric[Double](DataType.DOUBLE) { override val nullable = isNullable(metadata,index); val precisionRadix = 2; val precision = 128; val signed = metadata.isSigned(index); } /* Character string data types. */ case CHAR => new datatype.Character { override val nullable = isNullable(metadata,index); val length = metadata.getColumnDisplaySize(index); } case CLOB => new datatype.CharacterLargeObject { override val nullable = isNullable(metadata,index); } case LONGVARCHAR => { if (metadata.getColumnDisplaySize(index) >= 0) new datatype.CharacterVarying { override val nullable = isNullable(metadata,index); def length = metadata.getColumnDisplaySize(index); } else // A PostgreSQL Hack new datatype.CharacterLargeObject { override val nullable = isNullable(metadata,index); } } case VARCHAR => { if (metadata.getColumnDisplaySize(index) >= 0) new datatype.CharacterVarying { override val nullable = isNullable(metadata,index); def length = metadata.getColumnDisplaySize(index); } else // A PostgreSQL Hack new datatype.CharacterLargeObject { override val nullable = isNullable(metadata,index); } } /* Undefined cases. */ case OTHER => new datatype.Unknown { override val nullable = isNullable(metadata, index); } /* Unsupported data types. */ case REF | ARRAY | STRUCT => error ("I don't support composite data types yet."); case DATALINK | DISTINCT | JAVA_OBJECT | NULL => error ("I won't support strange data types."); /* Unsupported binary string data types. */ case BINARY | BLOB | LONGVARBINARY | VARBINARY => error ("I don't support binary string data types yet."); /* Unsupported date and time data types. */ case DATE | TIME | TIMESTAMP => error ("I don't support date and time data types yet."); /* Default case */ case x => error ("I don't know about this ("+metadata.getColumnTypeName(index)+") JDBC type.") } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?