aboutsummaryrefslogtreecommitdiff
path: root/odb/mssql/mssql-fwd.hxx
blob: f2acdcc47247ed1c074c36475644ec62ada6bf9a (plain)
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
// file      : odb/mssql/mssql-fwd.hxx
// copyright : Copyright (c) 2005-2019 Code Synthesis Tools CC
// license   : ODB NCUEL; see accompanying LICENSE file

#ifndef ODB_MSSQL_MSSQL_FWD_HXX
#define ODB_MSSQL_MSSQL_FWD_HXX

#include <odb/pre.hxx>

#include <cstddef> // std::size_t

// Forward declaration for some of the types defined in sqltypes.h or
// sqlncli.h. This allows us to avoid having to include these files
// in public headers.
//
#ifdef _WIN32

// Keep consistent with Windows ODBC headers.
//

typedef long             SQLINTEGER;
typedef unsigned long    SQLUINTEGER;

#ifdef _WIN64
typedef __int64          SQLLEN;
typedef unsigned __int64 SQLULEN;
#else
#ifndef SQLLEN
typedef SQLINTEGER       SQLLEN;
typedef SQLUINTEGER      SQLULEN;
#endif
#endif

#else // _WIN32

// Keep consistent with unixODBC headers.
//

template <std::size_t sizeof_long>
struct odbc_types;

template <>
struct odbc_types<4>
{
  typedef long           integer;
  typedef unsigned long  uinteger;

  typedef integer        len;
  typedef uinteger       ulen;
};

template <>
struct odbc_types<8>
{
  typedef int            integer;
  typedef unsigned int   uinteger;

  typedef long           len;
  typedef unsigned long  ulen;
};

typedef odbc_types<sizeof (long)>::integer  SQLINTEGER;
typedef odbc_types<sizeof (long)>::uinteger SQLUINTEGER;

#ifndef SQLLEN
typedef odbc_types<sizeof (long)>::len  SQLLEN;
typedef odbc_types<sizeof (long)>::ulen SQLULEN;
#endif

#endif // _WIN32

typedef short            SQLSMALLINT;
typedef unsigned short   SQLUSMALLINT;

typedef SQLSMALLINT      SQLRETURN;

typedef void*            SQLHANDLE;
typedef SQLHANDLE        SQLHENV;
typedef SQLHANDLE        SQLHDBC;
typedef SQLHANDLE        SQLHSTMT;
typedef SQLHANDLE        SQLHDESC;

// If you get a redefinition error or warning for one of these macros,
// then that means you included this header (or one that includes it),
// before <sql.h> or <sqlext.h>. As a general rule, include <sql.h> or
// <sqlext.h> before any of the ODB headers.
//
#ifndef SQL_HANDLE_ENV
#  define SQL_HANDLE_ENV  1
#  define SQL_HANDLE_DBC  2
#  define SQL_HANDLE_STMT 3
#  define SQL_HANDLE_DESC 4
#endif

#ifndef SQL_NULL_DATA
#  define SQL_NULL_DATA     (-1)
#  define SQL_DATA_AT_EXEC  (-2)
#  define SQL_NO_TOTAL      (-4)
#endif

// The following types are our own equivalents of ODBC and Native Client
// ODBC driver types. They are all PODs and should be layout-compatible
// with the original types, which means they can be used interchangeably.
//
namespace odb
{
  namespace mssql
  {
    // UCS-2 character type (SQLWCHAR).
    //
#ifdef _WIN32
    typedef wchar_t ucs2_char;
#else
    typedef unsigned short ucs2_char;
#endif

    // SQL_NUMERIC_STRUCT
    //
#ifndef SQL_MAX_NUMERIC_LEN
#define SQL_MAX_NUMERIC_LEN 16
#else
#  if SQL_MAX_NUMERIC_LEN != 16
#    error unexpected SQL_NUMERIC_STRUCT value
#  endif
#endif

    struct decimal
    {
      unsigned char precision;
      signed char scale;
      unsigned char sign; // 1 - positive, 0 - negative
      unsigned char val[SQL_MAX_NUMERIC_LEN];
    };

    // DBMONEY
    //
    struct money
    {
      // 8-byte signed integer containing value * 10,000.
      //
      int high;
      unsigned int low;
    };

    // DBMONEY4
    //
    struct smallmoney
    {
      int value; // 4-byte signed integer containing value * 10,000.
    };

    // SQL_DATE_STRUCT
    //
    struct date
    {
      SQLSMALLINT year;
      SQLUSMALLINT month;
      SQLUSMALLINT day;
    };

    // SQL_SS_TIME2_STRUCT
    //
#pragma pack(push,8)
    struct time
    {
      SQLUSMALLINT hour;
      SQLUSMALLINT minute;
      SQLUSMALLINT second;
      SQLUINTEGER fraction;
    };
#pragma pack(pop)

    // SQL_TIMESTAMP_STRUCT
    //
    struct datetime
    {
      SQLSMALLINT year;
      SQLUSMALLINT month;
      SQLUSMALLINT day;
      SQLUSMALLINT hour;
      SQLUSMALLINT minute;
      SQLUSMALLINT second;
      SQLUINTEGER fraction;
    };

    // SQL_SS_TIMESTAMPOFFSET_STRUCT
    //
#pragma pack(push,8)
    struct datetimeoffset
    {
      SQLSMALLINT year;
      SQLUSMALLINT month;
      SQLUSMALLINT day;
      SQLUSMALLINT hour;
      SQLUSMALLINT minute;
      SQLUSMALLINT second;
      SQLUINTEGER fraction;
      SQLSMALLINT timezone_hour;
      SQLSMALLINT timezone_minute;
    };
#pragma pack(pop)

    // SQLGUID
    //
    struct uniqueidentifier
    {
      unsigned int data1;
      unsigned short data2;
      unsigned short data3;
      unsigned char data4[8];
    };
  }
}

#include <odb/post.hxx>

#endif // ODB_MSSQL_MSSQL_FWD_HXX