forked from npgsql/npgsql
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPostgresArrayType.cs
More file actions
97 lines (87 loc) · 3.99 KB
/
PostgresArrayType.cs
File metadata and controls
97 lines (87 loc) · 3.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#region License
// The PostgreSQL License
//
// Copyright (C) 2017 The Npgsql Development Team
//
// Permission to use, copy, modify, and distribute this software and its
// documentation for any purpose, without fee, and without a written
// agreement is hereby granted, provided that the above copyright notice
// and this paragraph and the following two paragraphs appear in all copies.
//
// IN NO EVENT SHALL THE NPGSQL DEVELOPMENT TEAM BE LIABLE TO ANY PARTY
// FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES,
// INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS
// DOCUMENTATION, EVEN IF THE NPGSQL DEVELOPMENT TEAM HAS BEEN ADVISED OF
// THE POSSIBILITY OF SUCH DAMAGE.
//
// THE NPGSQL DEVELOPMENT TEAM SPECIFICALLY DISCLAIMS ANY WARRANTIES,
// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
// AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
// ON AN "AS IS" BASIS, AND THE NPGSQL DEVELOPMENT TEAM HAS NO OBLIGATIONS
// TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
#endregion
using System;
using System.Collections.Generic;
using JetBrains.Annotations;
using Npgsql.TypeHandlers;
namespace Npgsql.PostgresTypes
{
/// <summary>
/// Represents a PostgreSQL array data type, which can hold several multiple values in a single column.
/// </summary>
/// <remarks>
/// See https://www.postgresql.org/docs/current/static/arrays.html.
/// </remarks>
public class PostgresArrayType : PostgresType
{
/// <summary>
/// The PostgreSQL data type of the element contained within this array.
/// </summary>
[PublicAPI]
public PostgresType Element { get; }
/// <summary>
/// Constructs a representation of a PostgreSQL array data type.
/// </summary>
protected internal PostgresArrayType(string ns, string name, uint oid, PostgresType elementPostgresType)
: base(ns, name, oid)
{
Element = elementPostgresType;
if (elementPostgresType.NpgsqlDbType.HasValue)
NpgsqlDbType = NpgsqlTypes.NpgsqlDbType.Array | elementPostgresType.NpgsqlDbType;
Element.Array = this;
}
internal override TypeHandler Activate(TypeHandlerRegistry registry)
{
TypeHandler elementHandler;
if (!registry.TryGetByOID(Element.OID, out elementHandler))
{
// Element type hasn't been set up yet, do it now
elementHandler = Element.Activate(registry);
}
var arrayHandler = elementHandler.CreateArrayHandler(this);
registry.ByOID[OID] = arrayHandler;
var asEnumHandler = elementHandler as IEnumHandler;
if (asEnumHandler != null)
{
if (registry.ArrayHandlerByType == null)
registry.ArrayHandlerByType = new Dictionary<Type, TypeHandler>();
registry.ArrayHandlerByType[asEnumHandler.EnumType] = arrayHandler;
return arrayHandler;
}
var asCompositeHandler = elementHandler as ICompositeHandler;
if (asCompositeHandler != null)
{
if (registry.ArrayHandlerByType == null)
registry.ArrayHandlerByType = new Dictionary<Type, TypeHandler>();
registry.ArrayHandlerByType[asCompositeHandler.CompositeType] = arrayHandler;
return arrayHandler;
}
if (NpgsqlDbType.HasValue)
registry.ByNpgsqlDbType[NpgsqlDbType.Value] = arrayHandler;
// Note that array handlers aren't registered in _byType, because they handle all dimension types and not just one CLR type
// (e.g. int[], int[,], int[,,]). So the by-type lookup is special, see this[Type type]
// TODO: register single-dimensional in _byType as a specific optimization? But do PSV as well...
return arrayHandler;
}
}
}