File: sqlcontext.cs

package info (click to toggle)
mono 6.14.1%2Bds2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,282,732 kB
  • sloc: cs: 11,182,461; xml: 2,850,281; ansic: 699,123; cpp: 122,919; perl: 58,604; javascript: 30,841; asm: 21,845; makefile: 19,602; sh: 10,973; python: 4,772; pascal: 925; sql: 859; sed: 16; php: 1
file content (142 lines) | stat: -rw-r--r-- 4,829 bytes parent folder | download | duplicates (6)
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
//------------------------------------------------------------------------------
// <copyright file="SqlContext.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
// <owner current="true" primary="true">Microsoft</owner>
// <owner current="true" primary="false">Microsoft</owner>
// <owner current="true" primary="false">daltodov</owner>
//------------------------------------------------------------------------------

namespace Microsoft.SqlServer.Server {

    using System;
    using System.Data.Common;
    using System.Data.SqlClient;
    using System.Data.SqlTypes;
    using System.Diagnostics;
    using System.Security.Principal;

    public sealed class SqlContext {

        // There are no publicly visible instance methods/properties on SqlContext.
        //  With the current design, the user should never get an actual instance of
        //  this class.  Instances are only used internally to hold owned objects
        //  such as SqlPipe and SqlTriggerContext.
        
        private SmiContext        _smiContext;
        private SqlPipe           _pipe;
        private SqlTriggerContext _triggerContext;

        private SqlContext( SmiContext smiContext ) {
            _smiContext = smiContext;
            _smiContext.OutOfScope += new EventHandler(OnOutOfScope);
        }

        //
        //  Public API
        //

        public static bool IsAvailable { 
            get {
                bool result = InOutOfProcHelper.InProc;
                return result;
            }
        }
        
        // Get the SqlPipe (if any) for the current scope.
        public static SqlPipe Pipe {
            get {
                return CurrentContext.InstancePipe;
            }
        }

        // Get the SqlTriggerContext (if any) for the current scope.
        public static SqlTriggerContext TriggerContext {
            get {
                return CurrentContext.InstanceTriggerContext;
            }
        }

        public static WindowsIdentity WindowsIdentity{
            get {
                return CurrentContext.InstanceWindowsIdentity;
            }
        }

        //
        // Internal class methods
        //

        // CurrentContext should be the *only* way to get to an instance of SqlContext.
        private static SqlContext CurrentContext {
            get {
                SmiContext smiContext = SmiContextFactory.Instance.GetCurrentContext();

                SqlContext result = (SqlContext)smiContext.GetContextValue( (int)SmiContextFactory.ContextKey.SqlContext );

                if ( null == result ) {
                    result = new SqlContext( smiContext );
                    smiContext.SetContextValue( (int)SmiContextFactory.ContextKey.SqlContext, result );
                }

                return result;
            }
        }

        //
        //  Internal instance methods
        //
        private SqlPipe InstancePipe {
            get {
                if ( null == _pipe && _smiContext.HasContextPipe ) {
                    _pipe = new SqlPipe( _smiContext );
                }

                Debug.Assert( null == _pipe || _smiContext.HasContextPipe, "Caching logic error for contained pipe!" );

                return _pipe;
            }
        }

        private SqlTriggerContext InstanceTriggerContext {
            get {
                if ( null == _triggerContext ) {
                    bool[]               columnsUpdated;
                    TriggerAction        triggerAction;
                    SqlXml               eventInstanceData;
                    SmiEventSink_Default eventSink = new SmiEventSink_Default();
                
                    _smiContext.GetTriggerInfo(eventSink, out columnsUpdated, out triggerAction, out eventInstanceData);

                    eventSink.ProcessMessagesAndThrow();

                    if (TriggerAction.Invalid != triggerAction) {
                        _triggerContext = new SqlTriggerContext( triggerAction, columnsUpdated, eventInstanceData );
                    }
                }

                return _triggerContext;
            }
        }

        private WindowsIdentity InstanceWindowsIdentity {
            get {
                return _smiContext.WindowsIdentity;
            }
        }

        // Called whenever the context goes out of scope, we need to make
        // sure that we release internal state, such as the pipe's record buffer
        private void OnOutOfScope( object s, EventArgs e ) {
            if (Bid.AdvancedOn) {
                Bid.Trace( "<sc.SqlContext.OutOfScope|ADV> SqlContext is out of scope\n" );
            }

            if ( null != _pipe ) {
                _pipe.OnOutOfScope();
            }

            _triggerContext = null;
        }
    }
}