DeveelDB  20151217
complete SQL database system, primarly developed for .NET/Mono frameworks
Static Public Member Functions | Static Private Member Functions | List of all members
Deveel.Data.Sql.Parser.DataTypeBuilder Class Reference

Static Public Member Functions

static SqlType Build (ITypeResolver resolver, ISqlNode sqlNode)
 

Static Private Member Functions

static DataTypeMeta[] BuildTypeMeta (Dictionary< string, string > metadata)
 

Detailed Description

Definition at line 24 of file DataTypeBuilder.cs.

Member Function Documentation

static SqlType Deveel.Data.Sql.Parser.DataTypeBuilder.Build ( ITypeResolver  resolver,
ISqlNode  sqlNode 
)
inlinestatic

Definition at line 25 of file DataTypeBuilder.cs.

25  {
26  var node = sqlNode as DataTypeNode;
27  if (node == null)
28  throw new ArgumentException();
29 
30  var typeName = node.TypeName;
31  var typeMeta = new List<DataTypeMeta>();
32  SqlTypeCode sqlTypeCode;
33 
34  if (node.IsPrimitive) {
35  if (String.Equals(typeName, "LONG VARCHAR")) {
36  sqlTypeCode = SqlTypeCode.LongVarChar;
37  } else if (String.Equals(node.TypeName, "LONG VARBINARY")) {
38  sqlTypeCode = SqlTypeCode.LongVarBinary;
39  } else if (String.Equals(typeName, "INT", StringComparison.OrdinalIgnoreCase)) {
40  sqlTypeCode = SqlTypeCode.Integer;
41  } else {
42  try {
43  sqlTypeCode = (SqlTypeCode) Enum.Parse(typeof (SqlTypeCode), node.TypeName, true);
44  } catch (Exception) {
45  sqlTypeCode = SqlTypeCode.Unknown;
46  }
47  }
48 
49  if (sqlTypeCode == SqlTypeCode.Float ||
50  sqlTypeCode == SqlTypeCode.Real ||
51  sqlTypeCode == SqlTypeCode.Double ||
52  sqlTypeCode == SqlTypeCode.Decimal ||
53  sqlTypeCode == SqlTypeCode.Numeric) {
54  if (node.HasScale)
55  typeMeta.Add(new DataTypeMeta("Scale", node.Scale.ToString()));
56  if (node.HasPrecision)
57  typeMeta.Add(new DataTypeMeta("Precision", node.Precision.ToString()));
58  } else if (sqlTypeCode == SqlTypeCode.Char ||
59  sqlTypeCode == SqlTypeCode.VarChar ||
60  sqlTypeCode == SqlTypeCode.LongVarChar) {
61  if (node.HasSize)
62  typeMeta.Add(new DataTypeMeta("MaxSize", node.Size.ToString()));
63  if (node.HasLocale)
64  typeMeta.Add(new DataTypeMeta("Locale", node.Locale));
65  if (node.HasEncoding)
66  typeMeta.Add(new DataTypeMeta("Encoding", node.Encoding));
67  } else if (sqlTypeCode == SqlTypeCode.Binary ||
68  sqlTypeCode == SqlTypeCode.VarBinary ||
69  sqlTypeCode == SqlTypeCode.LongVarBinary) {
70  if (node.HasSize)
71  typeMeta.Add(new DataTypeMeta("MaxSize", node.Size.ToString()));
72  }
73 
74  // TODO: Support %ROWTYPE and %TYPE
75  } else {
76  sqlTypeCode = SqlTypeCode.Type;
77  }
78 
79  if (String.IsNullOrEmpty(typeName))
80  throw new SqlParseException("Could not determine type name.");
81 
82  DataTypeMeta[] meta = typeMeta.ToArray();
83  if (!node.IsPrimitive && node.Metadata != null)
84  meta = BuildTypeMeta(node.Metadata);
85 
86  var type = TypeResolver.Resolve(sqlTypeCode, typeName, meta, resolver);
87 
88  if (type == null)
89  throw new SqlParseException(String.Format("User defined type {0} could not be resolved.", typeName));
90 
91  return type;
92  }
A long string in the system.
static SqlType Resolve(SqlTypeCode typeCode, string typeName, DataTypeMeta[] metadata, ITypeResolver resolver)
Definition: TypeResolver.cs:21
static DataTypeMeta[] BuildTypeMeta(Dictionary< string, string > metadata)
SqlTypeCode
Enumerates the codes of all SQL types handled by the system.
Definition: SqlTypeCode.cs:23
static DataTypeMeta [] Deveel.Data.Sql.Parser.DataTypeBuilder.BuildTypeMeta ( Dictionary< string, string >  metadata)
inlinestaticprivate

Definition at line 94 of file DataTypeBuilder.cs.

94  {
95  return metadata.Select(x => new DataTypeMeta(x.Key, x.Value)).ToArray();
96  }

The documentation for this class was generated from the following file: