PageRenderTime 51ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 1ms

/src/dbc/scala/dbc/datatype/Factory.scala

https://github.com/mkneissl/scala
Scala | 250 lines | 219 code | 10 blank | 21 comment | 32 complexity | 73595430f9b2d394a7cf7f3c26527535 MD5 | raw file
  1. /* __ *\
  2. ** ________ ___ / / ___ Scala API **
  3. ** / __/ __// _ | / / / _ | (c) 2003-2011, LAMP/EPFL **
  4. ** __\ \/ /__/ __ |/ /__/ __ | **
  5. ** /____/\___/_/ |_/____/_/ | | **
  6. ** |/ **
  7. \* */
  8. package scala.dbc
  9. package datatype;
  10. import java.sql.Types._;
  11. import java.math.BigInteger;
  12. import java.math.BigDecimal;
  13. @deprecated(DbcIsDeprecated, "2.9.0") object Factory {
  14. final val java_lang_Integer_SIZE = 32;
  15. final val java_lang_Long_SIZE = 64;
  16. /** Returns a nullable property formatted as a boolean option */
  17. def isNullable (metadata:java.sql.ResultSetMetaData, index:Int): Option[scala.Boolean] =
  18. metadata.isNullable(index) match {
  19. case java.sql.ResultSetMetaData.columnNoNulls => Some(false);
  20. case java.sql.ResultSetMetaData.columnNullable => Some(true);
  21. case java.sql.ResultSetMetaData.columnNullableUnknown => None;
  22. }
  23. /** Returns the binary precision for an integer field. This should only be
  24. * used to find precision for integer numbers. It assumes that
  25. * bytes cannot be used partially (result % 8 = 0). */
  26. def bytePrecision (precision:Int, signed:scala.Boolean, safe:scala.Boolean): Int = {
  27. val decimalPrecision = precision + (if (safe) 1 else 0);
  28. Pair(signed,decimalPrecision) match {
  29. case Pair(_,0) => java.lang.Integer.MAX_VALUE // That's a bit of a hack.
  30. case Pair(_,dp) if (dp <= 3) => 8
  31. case Pair(_,dp) if (dp <= 5) => 16
  32. case Pair(true,dp) if (dp <= 7) => 24
  33. case Pair(false,dp) if (dp <= 8) => 24
  34. case Pair(_,dp) if (dp <= 10) => 32
  35. case Pair(true,dp) if (dp <= 12) => 40
  36. case Pair(false,dp) if (dp <= 13) => 40
  37. case Pair(_,dp) if (dp <= 15) => 48
  38. case Pair(_,dp) if (dp <= 17) => 56
  39. case Pair(true,dp) if (dp <= 19) => 64
  40. case Pair(false,dp) if (dp <= 20) => 64
  41. case Pair(_,dp) if (dp <= 22) => 72
  42. case Pair(true,dp) if (dp <= 24) => 80
  43. case Pair(false,dp) if (dp <= 25) => 80
  44. case Pair(_,dp) if (dp <= 27) => 88
  45. case Pair(_,dp) if (dp <= 29) => 96
  46. case Pair(_,dp) if (dp <= 32) => 104
  47. case Pair(_,dp) if (dp <= 34) => 112
  48. case Pair(true,dp) if (dp <= 36) => 120
  49. case Pair(false,dp) if (dp <= 37) => 120
  50. case Pair(_,dp) if (dp <= 39) => 128
  51. case _ => java.lang.Integer.MAX_VALUE
  52. }
  53. }
  54. def create (metadata:java.sql.ResultSetMetaData, index:Int): DataType = {
  55. metadata.getColumnType(index) match {
  56. /* Boolean data types. */
  57. case BOOLEAN => new datatype.Boolean {
  58. override val nullable = isNullable(metadata,index);
  59. }
  60. case BIT => new datatype.Boolean {
  61. override val nullable = isNullable(metadata,index);
  62. }
  63. /* Fixed precision numeric data types. */
  64. case DECIMAL => {
  65. Pair(bytePrecision(metadata.getPrecision(index),metadata.isSigned(index),true),metadata.getScale(index) == 0) match {
  66. case Pair(bp,true) if (bp <= java_lang_Integer_SIZE) =>
  67. new datatype.ExactNumeric[Int](DataType.INT) {
  68. override val nullable = isNullable(metadata,index);
  69. val precisionRadix = 10;
  70. val precision = metadata.getPrecision(index);
  71. val signed = metadata.isSigned(index);
  72. val scale = metadata.getScale(index);
  73. }
  74. case Pair(bp,true) if (bp <= java_lang_Long_SIZE) =>
  75. new datatype.ExactNumeric[Long](DataType.LONG) {
  76. override val nullable = isNullable(metadata,index);
  77. val precisionRadix = 10;
  78. val precision = metadata.getPrecision(index);
  79. val signed = metadata.isSigned(index);
  80. val scale = metadata.getScale(index);
  81. }
  82. case Pair(_,true) =>
  83. new datatype.ExactNumeric[BigInteger](DataType.BIG_INTEGER) {
  84. override val nullable = isNullable(metadata,index);
  85. val precisionRadix = 10;
  86. val precision = metadata.getPrecision(index);
  87. val signed = metadata.isSigned(index);
  88. val scale = metadata.getScale(index);
  89. }
  90. case Pair(_,false) =>
  91. new datatype.ExactNumeric[BigDecimal](DataType.BIG_DECIMAL) {
  92. override val nullable = isNullable(metadata,index);
  93. val precisionRadix = 10;
  94. val precision = metadata.getPrecision(index);
  95. val signed = metadata.isSigned(index);
  96. val scale = metadata.getScale(index);
  97. }
  98. }
  99. }
  100. case NUMERIC => {
  101. Pair(bytePrecision(metadata.getPrecision(index),metadata.isSigned(index),true),metadata.getScale(index) == 0) match {
  102. case Pair(bp,true) if (bp <= java_lang_Integer_SIZE) =>
  103. new datatype.ExactNumeric[Int](DataType.INT) {
  104. override val nullable = isNullable(metadata,index);
  105. val precisionRadix = 10;
  106. val precision = metadata.getPrecision(index);
  107. val signed = metadata.isSigned(index);
  108. val scale = metadata.getScale(index);
  109. }
  110. case Pair(bp,true) if (bp <= java_lang_Long_SIZE) =>
  111. new datatype.ExactNumeric[Long](DataType.LONG) {
  112. override val nullable = isNullable(metadata,index);
  113. val precisionRadix = 10;
  114. val precision = metadata.getPrecision(index);
  115. val signed = metadata.isSigned(index);
  116. val scale = metadata.getScale(index);
  117. }
  118. case Pair(_,true) =>
  119. new datatype.ExactNumeric[BigInteger](DataType.BIG_INTEGER) {
  120. override val nullable = isNullable(metadata,index);
  121. val precisionRadix = 10;
  122. val precision = metadata.getPrecision(index);
  123. val signed = metadata.isSigned(index);
  124. val scale = metadata.getScale(index);
  125. }
  126. case Pair(_,false) =>
  127. new datatype.ExactNumeric[BigDecimal](DataType.BIG_DECIMAL) {
  128. override val nullable = isNullable(metadata,index);
  129. val precisionRadix = 10;
  130. val precision = metadata.getPrecision(index);
  131. val signed = metadata.isSigned(index);
  132. val scale = metadata.getScale(index);
  133. }
  134. }
  135. }
  136. /* Fixed precision integer data types. */
  137. case BIGINT =>
  138. new datatype.ExactNumeric[Long](DataType.LONG) {
  139. override val nullable = isNullable(metadata,index);
  140. val precisionRadix = 2;
  141. val precision = 64;
  142. val signed = metadata.isSigned(index);
  143. val scale = 0;
  144. }
  145. case INTEGER =>
  146. new datatype.ExactNumeric[Int](DataType.INT) {
  147. override val nullable = isNullable(metadata,index);
  148. val precisionRadix = 2;
  149. val precision = 32;
  150. val signed = metadata.isSigned(index);
  151. val scale = 0;
  152. }
  153. case SMALLINT =>
  154. new datatype.ExactNumeric[Short](DataType.SHORT) {
  155. override val nullable = isNullable(metadata,index);
  156. val precisionRadix = 2;
  157. val precision = 16;
  158. val signed = metadata.isSigned(index);
  159. val scale = 0;
  160. }
  161. case TINYINT =>
  162. new datatype.ExactNumeric[Byte](DataType.BYTE) {
  163. override val nullable = isNullable(metadata,index);
  164. val precisionRadix = 2;
  165. val precision = 8;
  166. val signed = metadata.isSigned(index);
  167. val scale = 0;
  168. }
  169. /* Floating point numeric data types. */
  170. case REAL =>
  171. new datatype.ApproximateNumeric[Float](DataType.FLOAT) {
  172. override val nullable = isNullable(metadata,index);
  173. val precisionRadix = 2;
  174. val precision = 64;
  175. val signed = metadata.isSigned(index);
  176. }
  177. case DOUBLE =>
  178. new datatype.ApproximateNumeric[Double](DataType.DOUBLE) {
  179. override val nullable = isNullable(metadata,index);
  180. val precisionRadix = 2;
  181. val precision = 128;
  182. val signed = metadata.isSigned(index);
  183. }
  184. case FLOAT =>
  185. new datatype.ApproximateNumeric[Double](DataType.DOUBLE) {
  186. override val nullable = isNullable(metadata,index);
  187. val precisionRadix = 2;
  188. val precision = 128;
  189. val signed = metadata.isSigned(index);
  190. }
  191. /* Character string data types. */
  192. case CHAR => new datatype.Character {
  193. override val nullable = isNullable(metadata,index);
  194. val length = metadata.getColumnDisplaySize(index);
  195. }
  196. case CLOB => new datatype.CharacterLargeObject {
  197. override val nullable = isNullable(metadata,index);
  198. }
  199. case LONGVARCHAR => {
  200. if (metadata.getColumnDisplaySize(index) >= 0)
  201. new datatype.CharacterVarying {
  202. override val nullable = isNullable(metadata,index);
  203. def length = metadata.getColumnDisplaySize(index);
  204. }
  205. else // A PostgreSQL Hack
  206. new datatype.CharacterLargeObject {
  207. override val nullable = isNullable(metadata,index);
  208. }
  209. }
  210. case VARCHAR => {
  211. if (metadata.getColumnDisplaySize(index) >= 0)
  212. new datatype.CharacterVarying {
  213. override val nullable = isNullable(metadata,index);
  214. def length = metadata.getColumnDisplaySize(index);
  215. }
  216. else // A PostgreSQL Hack
  217. new datatype.CharacterLargeObject {
  218. override val nullable = isNullable(metadata,index);
  219. }
  220. }
  221. /* Undefined cases. */
  222. case OTHER => new datatype.Unknown {
  223. override val nullable = isNullable(metadata, index);
  224. }
  225. /* Unsupported data types. */
  226. case REF | ARRAY | STRUCT =>
  227. sys.error ("I don't support composite data types yet.");
  228. case DATALINK | DISTINCT | JAVA_OBJECT | NULL =>
  229. sys.error ("I won't support strange data types.");
  230. /* Unsupported binary string data types. */
  231. case BINARY | BLOB | LONGVARBINARY | VARBINARY =>
  232. sys.error ("I don't support binary string data types yet.");
  233. /* Unsupported date and time data types. */
  234. case DATE | TIME | TIMESTAMP =>
  235. sys.error ("I don't support date and time data types yet.");
  236. /* Default case */
  237. case x => sys.error ("I don't know about this ("+metadata.getColumnTypeName(index)+") JDBC type.")
  238. }
  239. }
  240. }