-
Notifications
You must be signed in to change notification settings - Fork 2
/
orm.prg
176 lines (116 loc) · 4.79 KB
/
orm.prg
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
#include "hbclass.ch"
#include "set.ch"
#define HB_DYN_CALLCONV_CDECL 0x0000000 // C default
#define HB_DYN_CTYPE_LONG_UNSIGNED 0x0000014
#define HB_DYN_CTYPE_CHAR_PTR 0x0000101
#define HB_DYN_CTYPE_LONG 0x0000004
#define HB_DYN_CTYPE_INT 0x0000003
#define HB_DYN_CTYPE_LLONG_UNSIGNED 0x0000015
#define NULL 0x0000000
#command SELECT <fields,...> [ FROM <cTableName> ] [ INTO <oTable> ]=> ;
[ <oTable> := ] Orm():Table( <cTableName>, <fields> )
static pLib, hMySQL
//----------------------------------------------------------------------------//
function Main()
local oOrm, oTable
SetMode( 60, 120 )
OrmConnect( "MYSQL", "localhost", "harbour", "password", "dbHarbour", 3306 )
// OrmConnect()
// SELECT "*" FROM "users" INTO oTable
// ? oTable:Count()
return nil
//----------------------------------------------------------------------------//
function OrmConnect( cRdbms, cServer, cUsername, cPassword, cDatabase, nPort )
return Orm():New( cRdbms, cServer, cUsername, cPassword, cDatabase, nPort )
//----------------------------------------------------------------------------//
CLASS Orm
DATA cRdbms
DATA cServer
DATA cUsername
DATA cDatabase
DATA nPort
DATA hConnection
DATA Tables INIT {}
METHOD New( cRdbms, cServer, cUsername, cPassword, cDatabase, nPort )
METHOD Table( cTableName )
ENDCLASS
//----------------------------------------------------------------------------//
METHOD New( cRdbms, cServer, cUsername, cPassword, cDatabase, nPort ) CLASS Orm
hb_default( @cRdbms, RddSetDefault() )
hb_default( @cServer, Set( _SET_PATH ) )
::cRdbms = cRdbms
::cServer = cServer
::cUsername = cUsername
::cDatabase = cDatabase
::nPort = nPort
do case
case cRdbms == "MYSQL"
if ! "Windows" $ OS()
pLib = hb_LibLoad( "/usr/lib/x86_64-linux-gnu/libmysqlclient.so" ) // libmysqlclient.so.20 for mariaDB
else
pLib = hb_LibLoad( "c:/Apache24/htdocs/libmysql.dll" )
endif
Alert( ValType( pLib ) )
if ! Empty( pLib )
hMySQL = mysql_init()
if hMySQL != 0
::hConnection = mysql_real_connect( cServer, cUsername, cPassword, cDatabase, nPort )
Alert( If( ::hConnection == hMySQL, "ok", "error" ) )
else
Alert( Str( hMySQL ) )
endif
else
Alert( "pLib is empty" )
endif
endcase
return Self
//----------------------------------------------------------------------------//
METHOD Table( cTableName ) CLASS Orm
local oTable
if Empty( ::cRdbms )
::New()
endif
if ! ::cRdbms $ "MYSQL,MARIADB"
USE ( cTableName ) VIA ::cRdbms SHARED
oTable = DbfTable():New( cTableName, Self )
AAdd( ::Tables, oTable )
else
endif
return oTable
//----------------------------------------------------------------------------//
CLASS Table
DATA Name
DATA Orm
METHOD New( cTableName, oOrm )
METHOD Count() VIRTUAL
ENDCLASS
//----------------------------------------------------------------------------//
METHOD New( cTableName, oOrm ) CLASS Table
::Name = cTableName
::Orm = oOrm
return Self
//----------------------------------------------------------------------------//
CLASS DbfTable FROM Table
DATA cAlias
METHOD New( cTableName, oOrm )
METHOD Count() INLINE RecCount()
ENDCLASS
//----------------------------------------------------------------------------//
METHOD New( cTableName, oOrm ) CLASS DbfTable
::Super:New( cTableName, oOrm )
::cAlias = Alias()
return Self
//----------------------------------------------------------------------------//
function mysql_init()
return hb_DynCall( { "mysql_init", pLib, hb_bitOr( HB_DYN_CTYPE_LLONG_UNSIGNED, HB_DYN_CALLCONV_CDECL ) }, NULL )
//----------------------------------------------------------------------------//
function mysql_real_connect( cServer, cUserName, cPassword, cDataBaseName, nPort )
if nPort == nil
nPort = 3306
endif
return hb_DynCall( { "mysql_real_connect", pLib, hb_bitOr( HB_DYN_CTYPE_LLONG_UNSIGNED, HB_DYN_CALLCONV_CDECL ),;
HB_DYN_CTYPE_LLONG_UNSIGNED,;
HB_DYN_CTYPE_CHAR_PTR, HB_DYN_CTYPE_CHAR_PTR, HB_DYN_CTYPE_CHAR_PTR, HB_DYN_CTYPE_CHAR_PTR,;
HB_DYN_CTYPE_LONG, HB_DYN_CTYPE_LONG, HB_DYN_CTYPE_LONG },;
hMySQL, cServer, cUserName, cPassword, cDataBaseName, nPort, 0, 0 )
//----------------------------------------------------------------------------//