Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
425437b2
Commit
425437b2
authored
Dec 03, 2019
by
Oleksandr Byelkin
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'connect/10.2' into 10.2
parents
f8b5e147
f0da39be
Changes
27
Show whitespace changes
Inline
Side-by-side
Showing
27 changed files
with
529 additions
and
348 deletions
+529
-348
storage/connect/CMakeLists.txt
storage/connect/CMakeLists.txt
+7
-4
storage/connect/connect.cc
storage/connect/connect.cc
+32
-32
storage/connect/connect.h
storage/connect/connect.h
+2
-0
storage/connect/filter.h
storage/connect/filter.h
+0
-1
storage/connect/ha_connect.cc
storage/connect/ha_connect.cc
+19
-12
storage/connect/mycat.cc
storage/connect/mycat.cc
+11
-104
storage/connect/mycat.h
storage/connect/mycat.h
+2
-2
storage/connect/myconn.cpp
storage/connect/myconn.cpp
+5
-5
storage/connect/plgdbsem.h
storage/connect/plgdbsem.h
+18
-11
storage/connect/reldef.cpp
storage/connect/reldef.cpp
+198
-80
storage/connect/reldef.h
storage/connect/reldef.h
+6
-3
storage/connect/restget.cpp
storage/connect/restget.cpp
+17
-23
storage/connect/tabcmg.cpp
storage/connect/tabcmg.cpp
+14
-9
storage/connect/tabdos.cpp
storage/connect/tabdos.cpp
+16
-7
storage/connect/tabdos.h
storage/connect/tabdos.h
+0
-1
storage/connect/tabfix.cpp
storage/connect/tabfix.cpp
+1
-1
storage/connect/tabfmt.cpp
storage/connect/tabfmt.cpp
+3
-2
storage/connect/tabjson.cpp
storage/connect/tabjson.cpp
+27
-17
storage/connect/tabmysql.cpp
storage/connect/tabmysql.cpp
+7
-2
storage/connect/tabrest.cpp
storage/connect/tabrest.cpp
+90
-22
storage/connect/tabrest.h
storage/connect/tabrest.h
+19
-0
storage/connect/tabutil.cpp
storage/connect/tabutil.cpp
+14
-2
storage/connect/tabutil.h
storage/connect/tabutil.h
+2
-1
storage/connect/tabvct.cpp
storage/connect/tabvct.cpp
+3
-0
storage/connect/tabxml.cpp
storage/connect/tabxml.cpp
+3
-1
storage/connect/xindex.cpp
storage/connect/xindex.cpp
+9
-5
storage/connect/xtable.h
storage/connect/xtable.h
+4
-1
No files found.
storage/connect/CMakeLists.txt
View file @
425437b2
...
...
@@ -318,6 +318,9 @@ ENDIF(CONNECT_WITH_MONGO)
OPTION
(
CONNECT_WITH_REST
"Compile CONNECT storage engine with REST support"
ON
)
IF
(
CONNECT_WITH_REST
)
MESSAGE
(
STATUS
"=====> REST support is ON"
)
SET
(
CONNECT_SOURCES
${
CONNECT_SOURCES
}
tabrest.cpp tabrest.h
)
add_definitions
(
-DREST_SUPPORT
)
FIND_PACKAGE
(
cpprestsdk QUIET
)
IF
(
cpprestsdk_FOUND
)
IF
(
UNIX
)
...
...
@@ -331,10 +334,10 @@ IF(CONNECT_WITH_REST)
# Comment it out if not needed depending on your cpprestsdk installation.
SET
(
CMAKE_CXX_FLAGS_DEBUG
"
${
CMAKE_CXX_FLAGS_DEBUG
}
/MDd"
)
ENDIF
(
UNIX
)
IF
(
REST_LIBRARY
)
SET
(
CONNECT_SOURCES
${
CONNECT_SOURCES
}
tabrest.cpp restget.cpp tabrest.h
)
add_definitions
(
-DREST_SUPPORT
)
ENDIF
()
# IF(REST_LIBRARY) why this? how about Windows
SET
(
CONNECT_SOURCES
${
CONNECT_SOURCES
}
restget.cpp
)
add_definitions
(
-DREST_SOURCE
)
#
ENDIF()
ELSE
(
NOT cpprestsdk_FOUND
)
# MESSAGE(STATUS "=====> cpprestsdk package not found")
ENDIF
(
cpprestsdk_FOUND
)
...
...
storage/connect/connect.cc
View file @
425437b2
...
...
@@ -566,7 +566,7 @@ int CntCloseTable(PGLOBAL g, PTDB tdbp, bool nox, bool abort)
rc
=
tdbp
->
DeleteDB
(
g
,
RC_EF
);
// Specific A.M. delete routine
}
else
if
(
tdbp
->
GetMode
()
==
MODE_UPDATE
&&
tdbp
->
IsIndexed
())
rc
=
((
PTDBDO
X
)
tdbp
)
->
Txfp
->
UpdateSortedRows
(
g
);
rc
=
((
PTDBDO
S
)
tdbp
)
->
GetTxfp
()
->
UpdateSortedRows
(
g
);
switch
(
rc
)
{
case
RC_FX
:
...
...
@@ -593,7 +593,7 @@ int CntCloseTable(PGLOBAL g, PTDB tdbp, bool nox, bool abort)
if
(
!
tdbp
->
IsRemote
())
{
// Make all the eventual indexes
PTDBDO
X
tbxp
=
(
PTDBDOX
)
tdbp
;
PTDBDO
S
tbxp
=
(
PTDBDOS
)
tdbp
;
tbxp
->
ResetKindex
(
g
,
NULL
);
tbxp
->
SetKey_Col
(
NULL
);
rc
=
tbxp
->
ResetTableOpt
(
g
,
true
,
tbxp
->
GetDef
()
->
Indexable
()
==
1
);
...
...
@@ -622,8 +622,8 @@ int CntCloseTable(PGLOBAL g, PTDB tdbp, bool nox, bool abort)
int
CntIndexInit
(
PGLOBAL
g
,
PTDB
ptdb
,
int
id
,
bool
sorted
)
{
PIXDEF
xdp
;
PTDBDO
X
tdbp
;
DO
X
DEF
*
dfp
;
PTDBDO
S
tdbp
;
DO
S
DEF
*
dfp
;
if
(
!
ptdb
)
return
-
1
;
...
...
@@ -633,9 +633,9 @@ int CntIndexInit(PGLOBAL g, PTDB ptdb, int id, bool sorted)
}
else
if
(
ptdb
->
GetDef
()
->
Indexable
()
==
3
)
{
return
1
;
}
else
tdbp
=
(
PTDBDO
X
)
ptdb
;
tdbp
=
(
PTDBDO
S
)
ptdb
;
dfp
=
(
DO
XDEF
*
)
tdbp
->
To_Def
;
dfp
=
(
DO
SDEF
*
)
tdbp
->
GetDef
()
;
//if (!(k= colp->GetKey()))
// if (colp->GetOpt() >= 2) {
...
...
@@ -645,16 +645,16 @@ int CntIndexInit(PGLOBAL g, PTDB ptdb, int id, bool sorted)
// This is a pseudo indexed sorted block optimized column
// return 0;
if
(
tdbp
->
To_Kindex
)
if
(((
XXBASE
*
)
tdbp
->
To_Kindex
)
->
GetID
()
==
id
)
{
tdbp
->
To_Kindex
->
Reset
();
// Same index
return
(
tdbp
->
To_Kindex
->
IsMul
())
?
2
:
1
;
if
(
tdbp
->
GetKindex
()
)
if
(((
XXBASE
*
)
tdbp
->
GetKindex
()
)
->
GetID
()
==
id
)
{
tdbp
->
GetKindex
()
->
Reset
();
// Same index
return
(
tdbp
->
GetKindex
()
->
IsMul
())
?
2
:
1
;
}
else
{
tdbp
->
To_Kindex
->
Close
();
tdbp
->
To_Kindex
=
NULL
;
tdbp
->
GetKindex
()
->
Close
();
tdbp
->
SetKindex
(
NULL
)
;
}
// endif colp
for
(
xdp
=
dfp
->
To_Indx
;
xdp
;
xdp
=
xdp
->
GetNext
())
for
(
xdp
=
dfp
->
GetIndx
()
;
xdp
;
xdp
=
xdp
->
GetNext
())
if
(
xdp
->
GetID
()
==
id
)
break
;
...
...
@@ -676,7 +676,7 @@ int CntIndexInit(PGLOBAL g, PTDB ptdb, int id, bool sorted)
if
(
tdbp
->
InitialyzeIndex
(
g
,
xdp
,
sorted
))
return
0
;
return
(
tdbp
->
To_Kindex
->
IsMul
())
?
2
:
1
;
return
(
tdbp
->
GetKindex
()
->
IsMul
())
?
2
:
1
;
}
// end of CntIndexInit
#if defined(WORDS_BIGENDIAN)
...
...
@@ -710,7 +710,7 @@ RCODE CntIndexRead(PGLOBAL g, PTDB ptdb, OPVAL op,
int
n
,
x
;
RCODE
rc
;
XXBASE
*
xbp
;
PTDBDO
X
tdbp
;
PTDBDO
S
tdbp
;
if
(
!
ptdb
)
return
RC_FX
;
...
...
@@ -736,12 +736,12 @@ RCODE CntIndexRead(PGLOBAL g, PTDB ptdb, OPVAL op,
goto
rnd
;
}
else
tdbp
=
(
PTDBDO
X
)
ptdb
;
tdbp
=
(
PTDBDO
S
)
ptdb
;
// Set reference values and index operator
if
(
!
tdbp
->
To_Link
||
!
tdbp
->
To_Kindex
)
{
if
(
!
tdbp
->
GetLink
()
||
!
tdbp
->
GetKindex
()
)
{
// if (!tdbp->To_Xdp) {
sprintf
(
g
->
Message
,
"Index not initialized for table %s"
,
tdbp
->
Name
);
sprintf
(
g
->
Message
,
"Index not initialized for table %s"
,
tdbp
->
GetName
()
);
return
RC_FX
;
#if 0
} // endif !To_Xdp
...
...
@@ -754,7 +754,7 @@ RCODE CntIndexRead(PGLOBAL g, PTDB ptdb, OPVAL op,
#endif // 0
}
// endif !To_Kindex
xbp
=
(
XXBASE
*
)
tdbp
->
To_Kindex
;
xbp
=
(
XXBASE
*
)
tdbp
->
GetKindex
()
;
if
(
kr
)
{
char
*
kp
=
(
char
*
)
kr
->
key
;
...
...
@@ -764,13 +764,13 @@ RCODE CntIndexRead(PGLOBAL g, PTDB ptdb, OPVAL op,
PVAL
valp
;
PCOL
colp
;
for
(
n
=
0
;
n
<
tdbp
->
Knum
;
n
++
)
{
colp
=
(
PCOL
)
tdbp
->
To_Key_Col
[
n
]
;
for
(
n
=
0
;
n
<
tdbp
->
GetKnum
()
;
n
++
)
{
colp
=
(
PCOL
)
tdbp
->
Key
(
n
)
;
if
(
colp
->
GetColUse
(
U_NULLS
))
kp
++
;
// Skip null byte
valp
=
tdbp
->
To_Link
[
n
]
->
GetValue
();
valp
=
tdbp
->
Link
(
n
)
->
GetValue
();
if
(
!
valp
->
IsTypeNum
())
{
if
(
colp
->
GetColUse
(
U_VAR
))
{
...
...
@@ -840,7 +840,7 @@ int CntIndexRange(PGLOBAL g, PTDB ptdb, const uchar* *key, uint *len,
bool
b
,
rcb
;
PVAL
valp
;
PCOL
colp
;
PTDBDO
X
tdbp
;
PTDBDO
S
tdbp
;
XXBASE
*
xbp
;
if
(
!
ptdb
)
...
...
@@ -865,35 +865,35 @@ int CntIndexRange(PGLOBAL g, PTDB ptdb, const uchar* *key, uint *len,
return
k
[
1
]
-
k
[
0
]
+
1
;
}
else
tdbp
=
(
PTDBDO
X
)
ptdb
;
tdbp
=
(
PTDBDO
S
)
ptdb
;
if
(
!
tdbp
->
To_Kindex
||
!
tdbp
->
To_Link
)
{
if
(
!
tdbp
->
To_Xdp
)
{
sprintf
(
g
->
Message
,
"Index not initialized for table %s"
,
tdbp
->
Name
);
if
(
!
tdbp
->
GetKindex
()
||
!
tdbp
->
GetLink
()
)
{
if
(
!
tdbp
->
GetXdp
()
)
{
sprintf
(
g
->
Message
,
"Index not initialized for table %s"
,
tdbp
->
GetName
()
);
DBUG_PRINT
(
"Range"
,
(
"%s"
,
g
->
Message
));
return
-
1
;
}
else
// Dynamic index
return
tdbp
->
To_Xdp
->
GetMaxSame
();
// TODO a better estimate
return
tdbp
->
GetXdp
()
->
GetMaxSame
();
// TODO a better estimate
}
else
xbp
=
(
XXBASE
*
)
tdbp
->
To_Kindex
;
xbp
=
(
XXBASE
*
)
tdbp
->
GetKindex
()
;
for
(
b
=
false
,
i
=
0
;
i
<
2
;
i
++
)
{
p
=
kp
=
key
[
i
];
if
(
kp
)
{
for
(
n
=
0
;
n
<
tdbp
->
Knum
;
n
++
)
{
for
(
n
=
0
;
n
<
tdbp
->
GetKnum
()
;
n
++
)
{
if
(
kmap
[
i
]
&
(
key_part_map
)(
1
<<
n
))
{
if
(
b
==
true
)
// Cannot do indexing with missing intermediate key
return
-
1
;
colp
=
(
PCOL
)
tdbp
->
To_Key_Col
[
n
]
;
colp
=
(
PCOL
)
tdbp
->
Key
(
n
)
;
if
(
colp
->
GetColUse
(
U_NULLS
))
p
++
;
// Skip null byte ???
valp
=
tdbp
->
To_Link
[
n
]
->
GetValue
();
valp
=
tdbp
->
Link
(
n
)
->
GetValue
();
if
(
!
valp
->
IsTypeNum
())
{
if
(
colp
->
GetColUse
(
U_VAR
))
{
...
...
storage/connect/connect.h
View file @
425437b2
...
...
@@ -46,6 +46,7 @@ int CntIndexRange(PGLOBAL g, PTDB ptdb, const uchar* *key, uint *len,
bool
*
incl
,
key_part_map
*
kmap
);
PGLOBAL
CntExit
(
PGLOBAL
g
);
#if 0
/***********************************************************************/
/* Definition of classes XKPDEF, DOXDEF, TDBDOX */
/* These classes purpose is chiefly to access protected items! */
...
...
@@ -76,3 +77,4 @@ class XKPDEF: public KPARTDEF {
public:
XKPDEF(const char *name, int n) : KPARTDEF((PSZ)name, n) {}
}; // end of class XKPDEF
#endif // 0
storage/connect/filter.h
View file @
425437b2
...
...
@@ -48,7 +48,6 @@ class DllExport FILTER : public XOBJECT { /* Filter description block */
PVAL
&
Val
(
int
i
)
{
return
Test
[
i
].
Value
;}
bool
&
Conv
(
int
i
)
{
return
Test
[
i
].
Conv
;}
void
SetNext
(
PFIL
filp
)
{
Next
=
filp
;}
bool
MakeSelector
(
PGLOBAL
g
,
PSTRG
s
);
// Methods
virtual
void
Reset
(
void
);
...
...
storage/connect/ha_connect.cc
View file @
425437b2
...
...
@@ -170,9 +170,9 @@
#define JSONMAX 10 // JSON Default max grp size
extern
"C"
{
char
version
[]
=
"Version 1.0
6.0010 June 01
, 2019"
;
char
version
[]
=
"Version 1.0
7.0001 November 12
, 2019"
;
#if defined(__WIN__)
char
compver
[]
=
"Version 1.0
6.0010
"
__DATE__
" "
__TIME__
;
char
compver
[]
=
"Version 1.0
7.0001
"
__DATE__
" "
__TIME__
;
char
slash
=
'\\'
;
#else // !__WIN__
char
slash
=
'/'
;
...
...
@@ -1045,6 +1045,8 @@ TABTYPE ha_connect::GetRealType(PTOS pos)
case
TAB_REST
:
type
=
TAB_NIY
;
break
;
default:
break
;
}
// endswitch type
#endif // REST_SUPPORT
...
...
@@ -2965,8 +2967,8 @@ PCFIL ha_connect::CheckCond(PGLOBAL g, PCFIL filp, const Item *cond)
case
Item_func
:
:
GE_FUNC
:
vop
=
OP_GE
;
break
;
case
Item_func
:
:
GT_FUNC
:
vop
=
OP_GT
;
break
;
case
Item_func
:
:
LIKE_FUNC
:
vop
=
OP_LIKE
;
neg
=
((
Item_func_opt_neg
*
)
condf
)
->
negated
;
vop
=
OP_LIKE
;
neg
=
((
Item_func_like
*
)
condf
)
->
negated
;
break
;
case
Item_func
:
:
ISNOTNULL_FUNC
:
neg
=
true
;
...
...
@@ -3785,9 +3787,9 @@ int ha_connect::index_init(uint idx, bool sorted)
active_index
=
MAX_KEY
;
rc
=
HA_ERR_INTERNAL_ERROR
;
}
else
if
(
tdbp
->
GetKindex
())
{
if
(((
PTDBDO
X
)
tdbp
)
->
To_Kindex
->
GetNum_K
())
{
if
(((
PTDBDO
S
)
tdbp
)
->
GetKindex
()
->
GetNum_K
())
{
if
(
tdbp
->
GetFtype
()
!=
RECFM_NAF
)
((
PTDBDO
X
)
tdbp
)
->
GetTxfp
()
->
ResetBuffer
(
g
);
((
PTDBDO
S
)
tdbp
)
->
GetTxfp
()
->
ResetBuffer
(
g
);
active_index
=
idx
;
// } else { // Void table
...
...
@@ -5632,6 +5634,8 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
case
TAB_CSV
:
ttp
=
TAB_REST
;
break
;
default:
break
;
}
// endswitch type
#endif // REST_SUPPORT
}
// endif ttp
...
...
@@ -6041,7 +6045,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
}
// endif !nblin
for
(
i
=
0
;
!
rc
&&
i
<
qrp
->
Nblin
;
i
++
)
{
typ
=
len
=
prec
=
dec
=
0
;
typ
=
len
=
prec
=
dec
=
flg
=
0
;
tm
=
NOT_NULL_FLAG
;
cnm
=
(
char
*
)
"noname"
;
dft
=
xtra
=
key
=
fmt
=
tn
=
NULL
;
...
...
@@ -6081,6 +6085,9 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
if
(
crp
->
Kdata
->
GetIntValue
(
i
))
tm
=
0
;
// Nullable
break
;
case
FLD_FLAG
:
flg
=
crp
->
Kdata
->
GetIntValue
(
i
);
break
;
case
FLD_FORMAT
:
fmt
=
(
crp
->
Kdata
)
?
crp
->
Kdata
->
GetCharValue
(
i
)
:
NULL
;
...
...
@@ -6212,7 +6219,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
// Now add the field
if
(
add_field
(
&
sql
,
cnm
,
typ
,
prec
,
dec
,
key
,
tm
,
rem
,
dft
,
xtra
,
fmt
,
0
,
dbf
,
v
))
fmt
,
flg
,
dbf
,
v
))
rc
=
HA_ERR_OUT_OF_MEM
;
}
// endfor i
...
...
@@ -7358,14 +7365,14 @@ maria_declare_plugin(connect)
&
connect_storage_engine
,
"CONNECT"
,
"Olivier Bertrand"
,
"Management of External Data (SQL/NOSQL/MED), including
many file forma
ts"
,
"Management of External Data (SQL/NOSQL/MED), including
Rest query resul
ts"
,
PLUGIN_LICENSE_GPL
,
connect_init_func
,
/* Plugin Init */
connect_done_func
,
/* Plugin Deinit */
0x010
6
,
/* version number (1.06
) */
0x010
7
,
/* version number (1.07
) */
NULL
,
/* status variables */
connect_system_variables
,
/* system variables */
"1.0
6.0010
"
,
/* string version */
"1.0
7.0001
"
,
/* string version */
MariaDB_PLUGIN_MATURITY_STABLE
/* maturity */
}
maria_declare_plugin_end
;
storage/connect/mycat.cc
View file @
425437b2
...
...
@@ -95,7 +95,7 @@
#endif // ZIP_SUPPORT
#if defined(REST_SUPPORT)
#include "tabrest.h"
#endif // R
est
_SUPPORT
#endif // R
EST
_SUPPORT
#include "mycat.h"
/***********************************************************************/
...
...
@@ -104,8 +104,9 @@
#if defined(__WIN__)
extern
"C"
HINSTANCE
s_hModule
;
// Saved module handle
#endif // !__WIN__
PQRYRES
OEMColumns
(
PGLOBAL
g
,
PTOS
topt
,
char
*
tab
,
char
*
db
,
bool
info
);
#if defined(JAVA_SUPPORT) || defined(CMGO_SUPPORT)
bool
MongoEnabled
(
void
);
#endif // JAVA_SUPPORT || CMGO_SUPPORT
/***********************************************************************/
/* Get the plugin directory. */
...
...
@@ -347,100 +348,6 @@ uint GetFuncID(const char *func)
return
fnc
;
}
// end of GetFuncID
/***********************************************************************/
/* OEMColumn: Get table column info for an OEM table. */
/***********************************************************************/
PQRYRES
OEMColumns
(
PGLOBAL
g
,
PTOS
topt
,
char
*
tab
,
char
*
db
,
bool
info
)
{
typedef
PQRYRES
(
__stdcall
*
XCOLDEF
)
(
PGLOBAL
,
void
*
,
char
*
,
char
*
,
bool
);
const
char
*
module
,
*
subtype
;
char
c
,
soname
[
_MAX_PATH
],
getname
[
40
]
=
"Col"
;
#if defined(__WIN__)
HANDLE
hdll
;
/* Handle to the external DLL */
#else // !__WIN__
void
*
hdll
;
/* Handle for the loaded shared library */
#endif // !__WIN__
XCOLDEF
coldef
=
NULL
;
PQRYRES
qrp
=
NULL
;
module
=
topt
->
module
;
subtype
=
topt
->
subtype
;
if
(
!
module
||
!
subtype
)
return
NULL
;
/*********************************************************************/
/* Ensure that the .dll doesn't have a path. */
/* This is done to ensure that only approved dll from the system */
/* directories are used (to make this even remotely secure). */
/*********************************************************************/
if
(
check_valid_path
(
module
,
strlen
(
module
)))
{
strcpy
(
g
->
Message
,
"Module cannot contain a path"
);
return
NULL
;
}
else
PlugSetPath
(
soname
,
module
,
GetPluginDir
());
// The exported name is always in uppercase
for
(
int
i
=
0
;
;
i
++
)
{
c
=
subtype
[
i
];
getname
[
i
+
3
]
=
toupper
(
c
);
if
(
!
c
)
break
;
}
// endfor i
#if defined(__WIN__)
// Load the Dll implementing the table
if
(
!
(
hdll
=
LoadLibrary
(
soname
)))
{
char
buf
[
256
];
DWORD
rc
=
GetLastError
();
sprintf
(
g
->
Message
,
MSG
(
DLL_LOAD_ERROR
),
rc
,
soname
);
FormatMessage
(
FORMAT_MESSAGE_FROM_SYSTEM
|
FORMAT_MESSAGE_IGNORE_INSERTS
,
NULL
,
rc
,
0
,
(
LPTSTR
)
buf
,
sizeof
(
buf
),
NULL
);
strcat
(
strcat
(
g
->
Message
,
": "
),
buf
);
return
NULL
;
}
// endif hDll
// Get the function returning an instance of the external DEF class
if
(
!
(
coldef
=
(
XCOLDEF
)
GetProcAddress
((
HINSTANCE
)
hdll
,
getname
)))
{
sprintf
(
g
->
Message
,
MSG
(
PROCADD_ERROR
),
GetLastError
(),
getname
);
FreeLibrary
((
HMODULE
)
hdll
);
return
NULL
;
}
// endif coldef
#else // !__WIN__
const
char
*
error
=
NULL
;
// Load the desired shared library
if
(
!
(
hdll
=
dlopen
(
soname
,
RTLD_LAZY
)))
{
error
=
dlerror
();
sprintf
(
g
->
Message
,
MSG
(
SHARED_LIB_ERR
),
soname
,
SVP
(
error
));
return
NULL
;
}
// endif Hdll
// Get the function returning an instance of the external DEF class
if
(
!
(
coldef
=
(
XCOLDEF
)
dlsym
(
hdll
,
getname
)))
{
error
=
dlerror
();
sprintf
(
g
->
Message
,
MSG
(
GET_FUNC_ERR
),
getname
,
SVP
(
error
));
dlclose
(
hdll
);
return
NULL
;
}
// endif coldef
#endif // !__WIN__
// Just in case the external Get function does not set error messages
sprintf
(
g
->
Message
,
"Error getting column info from %s"
,
subtype
);
// Get the table column definition
qrp
=
coldef
(
g
,
topt
,
tab
,
db
,
info
);
#if defined(__WIN__)
FreeLibrary
((
HMODULE
)
hdll
);
#else // !__WIN__
dlclose
(
hdll
);
#endif // !__WIN__
return
qrp
;
}
// end of OEMColumns
/* ------------------------- Class CATALOG --------------------------- */
/***********************************************************************/
...
...
@@ -481,10 +388,10 @@ void MYCAT::Reset(void)
/* GetTableDesc: retrieve a table descriptor. */
/* Look for a table descriptor matching the name and type. */
/***********************************************************************/
P
REL
DEF
MYCAT
::
GetTableDesc
(
PGLOBAL
g
,
PTABLE
tablep
,
P
TAB
DEF
MYCAT
::
GetTableDesc
(
PGLOBAL
g
,
PTABLE
tablep
,
LPCSTR
type
,
PRELDEF
*
)
{
P
REL
DEF
tdp
=
NULL
;
P
TAB
DEF
tdp
=
NULL
;
if
(
trace
(
1
))
htrc
(
"GetTableDesc: name=%s am=%s
\n
"
,
tablep
->
GetName
(),
SVP
(
type
));
...
...
@@ -505,12 +412,12 @@ PRELDEF MYCAT::GetTableDesc(PGLOBAL g, PTABLE tablep,
/* MakeTableDesc: make a table/view description. */
/* Note: caller must check if name already exists before calling it. */
/***********************************************************************/
P
REL
DEF
MYCAT
::
MakeTableDesc
(
PGLOBAL
g
,
PTABLE
tablep
,
LPCSTR
am
)
P
TAB
DEF
MYCAT
::
MakeTableDesc
(
PGLOBAL
g
,
PTABLE
tablep
,
LPCSTR
am
)
{
TABTYPE
tc
;
LPCSTR
name
=
(
PSZ
)
PlugDup
(
g
,
tablep
->
GetName
());
LPCSTR
schema
=
(
PSZ
)
PlugDup
(
g
,
tablep
->
GetSchema
());
P
REL
DEF
tdp
=
NULL
;
P
TAB
DEF
tdp
=
NULL
;
if
(
trace
(
1
))
htrc
(
"MakeTableDesc: name=%s schema=%s am=%s
\n
"
,
...
...
@@ -579,7 +486,7 @@ PRELDEF MYCAT::MakeTableDesc(PGLOBAL g, PTABLE tablep, LPCSTR am)
// Do make the table/view definition
if
(
tdp
&&
tdp
->
Define
(
g
,
this
,
name
,
schema
,
am
))
tdp
=
NULL
;
tdp
=
NULL
;
if
(
trace
(
1
))
htrc
(
"Table %s made
\n
"
,
am
);
...
...
@@ -592,7 +499,7 @@ PRELDEF MYCAT::MakeTableDesc(PGLOBAL g, PTABLE tablep, LPCSTR am)
/***********************************************************************/
PTDB
MYCAT
::
GetTable
(
PGLOBAL
g
,
PTABLE
tablep
,
MODE
mode
,
LPCSTR
type
)
{
P
REL
DEF
tdp
;
P
TAB
DEF
tdp
;
PTDB
tdbp
=
NULL
;
// LPCSTR name= tablep->GetName();
...
...
storage/connect/mycat.h
View file @
425437b2
...
...
@@ -102,14 +102,14 @@ class MYCAT : public CATALOG {
// Methods
void
Reset
(
void
);
bool
StoreIndex
(
PGLOBAL
,
PTABDEF
)
{
return
false
;}
// Temporary
P
REL
DEF
GetTableDesc
(
PGLOBAL
g
,
PTABLE
tablep
,
P
TAB
DEF
GetTableDesc
(
PGLOBAL
g
,
PTABLE
tablep
,
LPCSTR
type
,
PRELDEF
*
prp
=
NULL
);
PTDB
GetTable
(
PGLOBAL
g
,
PTABLE
tablep
,
MODE
mode
=
MODE_READ
,
LPCSTR
type
=
NULL
);
void
ClearDB
(
PGLOBAL
g
);
protected:
P
REL
DEF
MakeTableDesc
(
PGLOBAL
g
,
PTABLE
tablep
,
LPCSTR
am
);
P
TAB
DEF
MakeTableDesc
(
PGLOBAL
g
,
PTABLE
tablep
,
LPCSTR
am
);
// Members
ha_connect
*
Hc
;
// The Connect handler
...
...
storage/connect/myconn.cpp
View file @
425437b2
...
...
@@ -472,7 +472,7 @@ int MYSQLC::Open(PGLOBAL g, const char *host, const char *db,
int
pt
,
const
char
*
csname
)
{
const
char
*
pipe
=
NULL
;
uint
cto
=
10
,
nrt
=
20
;
//uint
cto = 10, nrt = 20;
my_bool
my_true
=
1
;
m_DB
=
mysql_init
(
NULL
);
...
...
@@ -485,11 +485,11 @@ int MYSQLC::Open(PGLOBAL g, const char *host, const char *db,
if
(
trace
(
1
))
htrc
(
"MYSQLC Open: m_DB=%.4X size=%d
\n
"
,
m_DB
,
(
int
)
sizeof
(
*
m_DB
));
// Removed to do like FEDERATED do
// Removed to do like FEDERATED do
es
//mysql_options(m_DB, MYSQL_READ_DEFAULT_GROUP, "client-mariadb");
mysql_options
(
m_DB
,
MYSQL_OPT_USE_REMOTE_CONNECTION
,
NULL
);
mysql_options
(
m_DB
,
MYSQL_OPT_CONNECT_TIMEOUT
,
&
cto
);
mysql_options
(
m_DB
,
MYSQL_OPT_READ_TIMEOUT
,
&
nrt
);
//
mysql_options(m_DB, MYSQL_OPT_USE_REMOTE_CONNECTION, NULL);
//
mysql_options(m_DB, MYSQL_OPT_CONNECT_TIMEOUT, &cto);
//
mysql_options(m_DB, MYSQL_OPT_READ_TIMEOUT, &nrt);
//mysql_options(m_DB, MYSQL_OPT_WRITE_TIMEOUT, ...);
#if defined(__WIN__)
...
...
storage/connect/plgdbsem.h
View file @
425437b2
...
...
@@ -149,16 +149,22 @@ enum AMT {TYPE_AM_ERROR = 0, /* Type not defined */
TYPE_AM_MGO
=
194
,
/* MGO access method type no */
TYPE_AM_OUT
=
200
};
/* Output relations (storage) */
enum
RECFM
{
RECFM_NAF
=
-
2
,
/* Not a file */
RECFM_OEM
=
-
1
,
/* OEM file access method */
RECFM_VAR
=
0
,
/* Varying length DOS files */
RECFM_FIX
=
1
,
/* Fixed length DOS files */
RECFM_BIN
=
2
,
/* Binary DOS files (also fixed) */
RECFM_VCT
=
3
,
/* VCT formatted files */
RECFM_ODBC
=
4
,
/* Table accessed via ODBC */
RECFM_JDBC
=
5
,
/* Table accessed via JDBC */
RECFM_PLG
=
6
,
/* Table accessed via PLGconn */
RECFM_DBF
=
7
};
/* DBase formatted file */
enum
RECFM
{
RECFM_DFLT
=
0
,
/* Default table type */
RECFM_NAF
=
1
,
/* Not a file table */
RECFM_OEM
=
2
,
/* OEM table */
RECFM_VAR
=
3
,
/* Varying length DOS files */
RECFM_FIX
=
4
,
/* Fixed length DOS files */
RECFM_BIN
=
5
,
/* Binary DOS files (also fixed) */
RECFM_DBF
=
6
,
/* DBase formatted file */
RECFM_CSV
=
7
,
/* CSV file */
RECFM_FMT
=
8
,
/* FMT formatted file */
RECFM_VCT
=
9
,
/* VCT formatted files */
RECFM_XML
=
10
,
/* XML formatted files */
RECFM_JASON
=
11
,
/* JASON formatted files */
RECFM_DIR
=
12
,
/* DIR table */
RECFM_ODBC
=
13
,
/* Table accessed via ODBC */
RECFM_JDBC
=
14
,
/* Table accessed via JDBC */
RECFM_PLG
=
15
};
/* Table accessed via PLGconn */
enum
MISC
{
DB_TABNO
=
1
,
/* DB routines in Utility Table */
MAX_MULT_KEY
=
10
,
/* Max multiple key number */
...
...
@@ -537,7 +543,8 @@ enum XFLD {FLD_NO = 0, /* Not a field definition item */
FLD_FORMAT
=
16
,
/* Field format */
FLD_CAT
=
17
,
/* Table catalog */
FLD_SCHEM
=
18
,
/* Table schema */
FLD_TABNAME
=
19
};
/* Column Table name */
FLD_TABNAME
=
19
,
/* Column Table name */
FLD_FLAG
=
20
};
/* Field flag (CONNECT specific) */
/***********************************************************************/
/* Result of last SQL noconv query. */
...
...
storage/connect/reldef.cpp
View file @
425437b2
/************* RelDef CPP Program Source Code File (.CPP) **************/
/* PROGRAM NAME: RELDEF */
/* ------------- */
/* Version 1.
6
*/
/* Version 1.
7
*/
/* */
/* COPYRIGHT: */
/* ---------- */
/* (C) Copyright to the author Olivier BERTRAND 2004-201
6
*/
/* (C) Copyright to the author Olivier BERTRAND 2004-201
9
*/
/* */
/* WHAT THIS PROGRAM DOES: */
/* ----------------------- */
...
...
@@ -61,6 +61,102 @@ extern handlerton *connect_hton;
/***********************************************************************/
USETEMP
UseTemp
(
void
);
char
*
GetPluginDir
(
void
);
PQRYRES
OEMColumns
(
PGLOBAL
g
,
PTOS
topt
,
char
*
tab
,
char
*
db
,
bool
info
);
/***********************************************************************/
/* OEMColumns: Get table column info for an OEM table. */
/***********************************************************************/
PQRYRES
OEMColumns
(
PGLOBAL
g
,
PTOS
topt
,
char
*
tab
,
char
*
db
,
bool
info
)
{
typedef
PQRYRES
(
__stdcall
*
XCOLDEF
)
(
PGLOBAL
,
void
*
,
char
*
,
char
*
,
bool
);
const
char
*
module
,
*
subtype
;
char
c
,
soname
[
_MAX_PATH
],
getname
[
40
]
=
"Col"
;
#if defined(__WIN__)
HANDLE
hdll
;
/* Handle to the external DLL */
#else // !__WIN__
void
*
hdll
;
/* Handle for the loaded shared library */
#endif // !__WIN__
XCOLDEF
coldef
=
NULL
;
PQRYRES
qrp
=
NULL
;
module
=
topt
->
module
;
subtype
=
topt
->
subtype
;
if
(
!
module
||
!
subtype
)
return
NULL
;
/*********************************************************************/
/* Ensure that the .dll doesn't have a path. */
/* This is done to ensure that only approved dll from the system */
/* directories are used (to make this even remotely secure). */
/*********************************************************************/
if
(
check_valid_path
(
module
,
strlen
(
module
)))
{
strcpy
(
g
->
Message
,
"Module cannot contain a path"
);
return
NULL
;
}
else
PlugSetPath
(
soname
,
module
,
GetPluginDir
());
// The exported name is always in uppercase
for
(
int
i
=
0
;
;
i
++
)
{
c
=
subtype
[
i
];
getname
[
i
+
3
]
=
toupper
(
c
);
if
(
!
c
)
break
;
}
// endfor i
#if defined(__WIN__)
// Load the Dll implementing the table
if
(
!
(
hdll
=
LoadLibrary
(
soname
)))
{
char
buf
[
256
];
DWORD
rc
=
GetLastError
();
sprintf
(
g
->
Message
,
MSG
(
DLL_LOAD_ERROR
),
rc
,
soname
);
FormatMessage
(
FORMAT_MESSAGE_FROM_SYSTEM
|
FORMAT_MESSAGE_IGNORE_INSERTS
,
NULL
,
rc
,
0
,
(
LPTSTR
)
buf
,
sizeof
(
buf
),
NULL
);
strcat
(
strcat
(
g
->
Message
,
": "
),
buf
);
return
NULL
;
}
// endif hDll
// Get the function returning an instance of the external DEF class
if
(
!
(
coldef
=
(
XCOLDEF
)
GetProcAddress
((
HINSTANCE
)
hdll
,
getname
)))
{
sprintf
(
g
->
Message
,
MSG
(
PROCADD_ERROR
),
GetLastError
(),
getname
);
FreeLibrary
((
HMODULE
)
hdll
);
return
NULL
;
}
// endif coldef
#else // !__WIN__
const
char
*
error
=
NULL
;
// Load the desired shared library
if
(
!
(
hdll
=
dlopen
(
soname
,
RTLD_LAZY
)))
{
error
=
dlerror
();
sprintf
(
g
->
Message
,
MSG
(
SHARED_LIB_ERR
),
soname
,
SVP
(
error
));
return
NULL
;
}
// endif Hdll
// Get the function returning an instance of the external DEF class
if
(
!
(
coldef
=
(
XCOLDEF
)
dlsym
(
hdll
,
getname
)))
{
error
=
dlerror
();
sprintf
(
g
->
Message
,
MSG
(
GET_FUNC_ERR
),
getname
,
SVP
(
error
));
dlclose
(
hdll
);
return
NULL
;
}
// endif coldef
#endif // !__WIN__
// Just in case the external Get function does not set error messages
sprintf
(
g
->
Message
,
"Error getting column info from %s"
,
subtype
);
// Get the table column definition
qrp
=
coldef
(
g
,
topt
,
tab
,
db
,
info
);
#if defined(__WIN__)
FreeLibrary
((
HMODULE
)
hdll
);
#else // !__WIN__
dlclose
(
hdll
);
#endif // !__WIN__
return
qrp
;
}
// end of OEMColumns
/* --------------------------- Class RELDEF -------------------------- */
...
...
@@ -208,6 +304,7 @@ TABDEF::TABDEF(void)
{
Schema
=
NULL
;
Desc
=
NULL
;
Recfm
=
RECFM_DFLT
;
Catfunc
=
FNC_NO
;
Card
=
0
;
Elemt
=
0
;
...
...
@@ -220,12 +317,41 @@ TABDEF::TABDEF(void)
csname
=
NULL
;
}
// end of TABDEF constructor
/***********************************************************************/
/* Return the table format. */
/***********************************************************************/
RECFM
TABDEF
::
GetTableFormat
(
const
char
*
type
)
{
RECFM
recfm
=
Recfm
;
if
(
recfm
==
RECFM_DFLT
)
{
// Default format depends on the table type
TABTYPE
tc
=
(
Catfunc
==
FNC_NO
)
?
GetTypeID
(
type
)
:
TAB_PRX
;
switch
(
tc
)
{
case
TAB_DOS
:
recfm
=
RECFM_VAR
;
break
;
case
TAB_CSV
:
recfm
=
RECFM_CSV
;
break
;
case
TAB_FMT
:
recfm
=
RECFM_FMT
;
break
;
case
TAB_FIX
:
recfm
=
RECFM_FIX
;
break
;
case
TAB_BIN
:
recfm
=
RECFM_BIN
;
break
;
case
TAB_VEC
:
recfm
=
RECFM_VCT
;
break
;
case
TAB_DBF
:
recfm
=
RECFM_DBF
;
break
;
case
TAB_XML
:
recfm
=
RECFM_XML
;
break
;
case
TAB_DIR
:
recfm
=
RECFM_DIR
;
break
;
default:
recfm
=
RECFM_NAF
;
break
;
}
// endswitch type
}
// endif recfm
return
recfm
;
}
// end of GetTableFormat
/***********************************************************************/
/* Define: initialize the table definition block from XDB file. */
/***********************************************************************/
bool
TABDEF
::
Define
(
PGLOBAL
g
,
PCATLG
cat
,
LPCSTR
name
,
LPCSTR
schema
,
LPCSTR
am
)
{
{
int
poff
=
0
;
Hc
=
((
MYCAT
*
)
cat
)
->
GetHandler
();
...
...
@@ -243,13 +369,17 @@ bool TABDEF::Define(PGLOBAL g, PCATLG cat,
NULL
;
csname
=
GetStringCatInfo
(
g
,
"Table_charset"
,
NULL
);
// Do the definition of AM specific fields
if
(
DefineAM
(
g
,
am
,
0
))
return
true
;
// Get The column definitions
if
((
poff
=
GetColCatInfo
(
g
)
)
<
0
)
if
(
stricmp
(
am
,
"OEM"
)
&&
GetColCatInfo
(
g
)
<
0
)
return
true
;
// Do the definition of AM specific fields
return
DefineAM
(
g
,
am
,
poff
)
;
}
// end of Define
Hc
->
tshp
=
NULL
;
// TO BE CHECKED
return
false
;
}
// end of Define
/***********************************************************************/
/* This function returns the database data path. */
...
...
@@ -264,71 +394,71 @@ PCSZ TABDEF::GetPath(void)
/***********************************************************************/
int
TABDEF
::
GetColCatInfo
(
PGLOBAL
g
)
{
char
*
type
=
GetStringCatInfo
(
g
,
"Type"
,
"*"
);
char
*
type
=
GetStringCatInfo
(
g
,
"Type"
,
"*"
);
char
c
,
fty
,
eds
;
int
i
,
n
,
loff
,
poff
,
nof
,
nlg
;
void
*
field
=
NULL
;
TABTYPE
tc
;
PCOLDEF
cdp
,
lcdp
=
NULL
,
tocols
=
NULL
;
void
*
field
=
NULL
;
RECFM
trf
;
PCOLDEF
cdp
,
lcdp
=
NULL
,
tocols
=
NULL
;
PCOLINFO
pcf
=
(
PCOLINFO
)
PlugSubAlloc
(
g
,
NULL
,
sizeof
(
COLINFO
));
memset
(
pcf
,
0
,
sizeof
(
COLINFO
));
// Get
a unique char identifier for type
tc
=
(
Catfunc
==
FNC_NO
)
?
GetTypeID
(
type
)
:
TAB_PRX
;
// Get
the table format
trf
=
GetTableFormat
(
type
)
;
// Take care of the column definitions
i
=
poff
=
nof
=
nlg
=
0
;
#if defined(__WIN__)
// Offsets of HTML and DIR tables start from 0, DBF at 1
loff
=
(
t
c
==
TAB_DBF
)
?
1
:
(
tc
==
TAB_XML
||
tc
==
TAB
_DIR
)
?
-
1
:
0
;
loff
=
(
t
rf
==
RECFM_DBF
)
?
1
:
(
trf
==
RECFM_XML
||
trf
==
RECFM
_DIR
)
?
-
1
:
0
;
#else // !__WIN__
// Offsets of HTML tables start from 0, DIR and DBF at 1
loff
=
(
t
c
==
TAB_DBF
||
tc
==
TAB_DIR
)
?
1
:
(
tc
==
TAB
_XML
)
?
-
1
:
0
;
loff
=
(
t
rf
==
RECFM_DBF
||
trf
==
RECFM_DIR
)
?
1
:
(
trf
==
RECFM
_XML
)
?
-
1
:
0
;
#endif // !__WIN__
while
(
true
)
{
// Default Offset depends on table
type
switch
(
t
c
)
{
case
TAB_DOS
:
case
TAB
_FIX
:
case
TAB
_BIN
:
case
TAB_VEC
:
case
TAB
_DBF
:
// Default Offset depends on table
format
switch
(
t
rf
)
{
case
RECFM_VAR
:
case
RECFM
_FIX
:
case
RECFM
_BIN
:
case
RECFM_VCT
:
case
RECFM
_DBF
:
poff
=
loff
+
nof
;
// Default next offset
nlg
=
MY_MAX
(
nlg
,
poff
);
// Default lrecl
break
;
case
TAB
_CSV
:
case
TAB
_FMT
:
case
RECFM
_CSV
:
case
RECFM
_FMT
:
nlg
+=
nof
;
case
TAB
_DIR
:
case
TAB
_XML
:
case
RECFM
_DIR
:
case
RECFM
_XML
:
poff
=
loff
+
(
pcf
->
Flags
&
U_VIRTUAL
?
0
:
1
);
break
;
case
TAB
_INI
:
case
TAB
_MAC
:
case
TAB
_TBL
:
case
TAB
_XCL
:
case
TAB
_OCCUR
:
case
TAB
_PRX
:
case
TAB
_OEM
:
//case RECFM
_INI:
//case RECFM
_MAC:
//case RECFM
_TBL:
//case RECFM
_XCL:
//case RECFM
_OCCUR:
//case RECFM
_PRX:
case
RECFM
_OEM
:
poff
=
0
;
// Offset represents an independant flag
break
;
default:
//
VCT
PLG ODBC JDBC MYSQL WMI...
default:
// PLG ODBC JDBC MYSQL WMI...
poff
=
0
;
// NA
break
;
}
// endswitch t
c
}
// endswitch t
rf
// do {
field
=
Hc
->
GetColumnOption
(
g
,
field
,
pcf
);
// } while (field && (*pcf->Name =='*' /*|| pcf->Flags & U_VIRTUAL*/));
if
(
t
c
==
TAB
_DBF
&&
pcf
->
Type
==
TYPE_DATE
&&
!
pcf
->
Datefmt
)
{
if
(
t
rf
==
RECFM
_DBF
&&
pcf
->
Type
==
TYPE_DATE
&&
!
pcf
->
Datefmt
)
{
// DBF date format defaults to 'YYYMMDD'
pcf
->
Datefmt
=
"YYYYMMDD"
;
pcf
->
Length
=
8
;
}
// endif t
c
}
// endif t
rf
if
(
!
field
)
break
;
...
...
@@ -341,10 +471,10 @@ int TABDEF::GetColCatInfo(PGLOBAL g)
else
loff
=
cdp
->
GetOffset
();
switch
(
t
c
)
{
case
TAB_VEC
:
switch
(
t
rf
)
{
case
RECFM_VCT
:
cdp
->
SetOffset
(
0
);
// Not to have shift
case
TAB
_BIN
:
case
RECFM
_BIN
:
// BIN/VEC are packed by default
if
(
nof
)
{
// Field width is the internal representation width
...
...
@@ -395,7 +525,7 @@ int TABDEF::GetColCatInfo(PGLOBAL g)
default:
break
;
}
// endswitch t
c
}
// endswitch t
rf
if
(
lcdp
)
lcdp
->
SetNext
(
cdp
);
...
...
@@ -413,21 +543,15 @@ int TABDEF::GetColCatInfo(PGLOBAL g)
if
(
GetDefType
()
==
TYPE_AM_DOS
)
{
int
ending
,
recln
=
0
;
// Was commented because sometimes ending is 0 even when
// not specified (for instance if quoted is specified)
// if ((ending= Hc->GetIntegerOption("Ending")) < 0) {
if
((
ending
=
Hc
->
GetIntegerOption
(
"Ending"
))
<=
0
)
{
ending
=
(
tc
==
TAB_BIN
||
tc
==
TAB_VEC
)
?
0
:
CRLF
;
Hc
->
SetIntegerOption
(
"Ending"
,
ending
);
}
// endif ending
ending
=
Hc
->
GetIntegerOption
(
"Ending"
);
// Calculate the default record size
switch
(
t
c
)
{
case
TAB
_FIX
:
case
TAB
_BIN
:
switch
(
t
rf
)
{
case
RECFM
_FIX
:
case
RECFM
_BIN
:
recln
=
nlg
+
ending
;
// + length of line ending
break
;
case
TAB_VEC
:
case
RECFM_VCT
:
recln
=
nlg
;
// if ((k= (pak < 0) ? 8 : pak) > 1)
...
...
@@ -436,18 +560,18 @@ int TABDEF::GetColCatInfo(PGLOBAL g)
// recln= ((recln + k - 1) / k) * k;
break
;
case
TAB_DOS
:
case
TAB
_DBF
:
case
RECFM_VAR
:
case
RECFM
_DBF
:
recln
=
nlg
;
break
;
case
TAB
_CSV
:
case
TAB
_FMT
:
case
RECFM
_CSV
:
case
RECFM
_FMT
:
// The number of separators (assuming an extra one can exist)
// recln= poff * ((qotd) ? 3 : 1); to be investigated
recln
=
nlg
+
poff
*
3
;
// To be safe
default:
break
;
}
// endswitch t
c
}
// endswitch t
rf
// lrecl must be at least recln to avoid buffer overflow
if
(
trace
(
1
))
...
...
@@ -461,7 +585,7 @@ int TABDEF::GetColCatInfo(PGLOBAL g)
if
(
trace
(
1
))
htrc
(
"Lrecl set to %d
\n
"
,
recln
);
}
// endif
Lrecl
}
// endif
TYPE
// Attach the column definition to the tabdef
SetCols
(
tocols
);
...
...
@@ -500,7 +624,8 @@ PTABDEF OEMDEF::GetXdef(PGLOBAL g)
return
NULL
;
}
else
// PlugSetPath(soname, Module, GetPluginDir()); // Crashes on Fedora
strncat
(
strcpy
(
soname
,
GetPluginDir
()),
Module
,
_MAX_PATH
);
strncat
(
strcpy
(
soname
,
GetPluginDir
()),
Module
,
sizeof
(
soname
)
-
strlen
(
soname
)
-
1
);
#if defined(__WIN__)
// Is the DLL already loaded?
...
...
@@ -596,10 +721,6 @@ PTABDEF OEMDEF::GetXdef(PGLOBAL g)
cat
->
Cbuf
=
(
char
*
)
PlugSubAlloc
(
g
,
NULL
,
cat
->
Cblen
);
}
// endif Cbuf
// Here "OEM" should be replace by a more useful value
if
(
xdefp
->
Define
(
g
,
cat
,
Name
,
Schema
,
"OEM"
))
return
NULL
;
// Ok, return external block
return
xdefp
;
}
// end of GetXdef
...
...
@@ -632,7 +753,13 @@ bool OEMDEF::DefineAM(PGLOBAL g, LPCSTR, int)
+
strlen
(
Subtype
)
+
3
);
sprintf
(
desc
,
"%s(%s)"
,
Module
,
Subtype
);
Desc
=
desc
;
return
false
;
// If define block not here yet, get it now
if
(
!
Pxdef
&&
!
(
Pxdef
=
GetXdef
(
g
)))
return
true
;
// Error
// Here "OEM" should be replace by a more useful value
return
Pxdef
->
Define
(
g
,
Cat
,
Name
,
Schema
,
Subtype
);
}
// end of DefineAM
/***********************************************************************/
...
...
@@ -640,7 +767,6 @@ bool OEMDEF::DefineAM(PGLOBAL g, LPCSTR, int)
/***********************************************************************/
PTDB
OEMDEF
::
GetTable
(
PGLOBAL
g
,
MODE
mode
)
{
RECFM
rfm
;
PTDB
tdbp
=
NULL
;
// If define block not here yet, get it now
...
...
@@ -653,18 +779,10 @@ PTDB OEMDEF::GetTable(PGLOBAL g, MODE mode)
/*********************************************************************/
if
(
!
(
tdbp
=
Pxdef
->
GetTable
(
g
,
mode
)))
return
NULL
;
else
rfm
=
tdbp
->
GetFtype
();
if
(
rfm
==
RECFM_NAF
)
return
tdbp
;
else
if
(
rfm
==
RECFM_OEM
)
{
if
(
Multiple
)
else
if
(
Multiple
&&
tdbp
->
GetFtype
()
==
RECFM_OEM
)
tdbp
=
new
(
g
)
TDBMUL
(
tdbp
);
// No block optimization yet
return
tdbp
;
}
// endif OEM
#if 0
/*********************************************************************/
/* The OEM table is based on a file type (currently DOS+ only) */
/*********************************************************************/
...
...
@@ -723,7 +841,7 @@ PTDB OEMDEF::GetTable(PGLOBAL g, MODE mode)
if
(
Multiple
)
tdbp
=
new
(
g
)
TDBMUL
(
tdbp
);
#endif // 0
return
tdbp
;
}
// end of GetTable
...
...
storage/connect/reldef.h
View file @
425437b2
...
...
@@ -84,9 +84,11 @@ class DllExport TABDEF : public RELDEF { /* Logical table descriptor */
void
SetNext
(
PTABDEF
tdfp
)
{
Next
=
tdfp
;}
int
GetMultiple
(
void
)
{
return
Multiple
;}
int
GetPseudo
(
void
)
{
return
Pseudo
;}
RECFM
GetRecfm
(
void
)
{
return
Recfm
;}
PCSZ
GetPath
(
void
);
//PSZ GetPath(void)
// {return (Database) ? (PSZ)Database : Cat->GetDataPath();}
RECFM
GetTableFormat
(
const
char
*
type
);
bool
SepIndex
(
void
)
{
return
GetBoolCatInfo
(
"SepIndex"
,
false
);}
bool
IsReadOnly
(
void
)
{
return
Read_Only
;}
virtual
AMT
GetDefType
(
void
)
{
return
TYPE_AM_TAB
;}
...
...
@@ -108,6 +110,7 @@ class DllExport TABDEF : public RELDEF { /* Logical table descriptor */
// Members
PCSZ
Schema
;
/* Table schema (for ODBC) */
PCSZ
Desc
;
/* Table description */
RECFM
Recfm
;
/* File or table format */
uint
Catfunc
;
/* Catalog function ID */
int
Card
;
/* (max) number of rows in table */
int
Elemt
;
/* Number of rows in blocks or rowset */
...
...
storage/connect/restget.cpp
View file @
425437b2
...
...
@@ -4,12 +4,6 @@
/***********************************************************************/
#include <cpprest/filestream.h>
#include <cpprest/http_client.h>
#if defined(MARIADB)
#include <my_global.h>
#else
#include "mini-global.h"
#define _OS_H_INCLUDED // Prevent os.h to be called
#endif
using
namespace
utility
::
conversions
;
// String conversions utilities
using
namespace
web
;
// Common features like URIs.
...
...
@@ -17,24 +11,24 @@ using namespace web::http; // Common HTTP functionality
using
namespace
web
::
http
::
client
;
// HTTP client features
using
namespace
concurrency
::
streams
;
// Asynchronous streams
#include "global.h"
typedef
const
char
*
PCSZ
;
/***********************************************************************/
/* Make a local copy of the requested file. */
/***********************************************************************/
int
restGetFile
(
PGLOBAL
g
,
PCSZ
http
,
PCSZ
uri
,
PCSZ
fn
)
int
restGetFile
(
char
*
m
,
bool
xt
,
PCSZ
http
,
PCSZ
uri
,
PCSZ
fn
)
{
int
rc
=
0
;
bool
xt
=
trace
(
515
);
auto
fileStream
=
std
::
make_shared
<
ostream
>
();
if
(
!
http
||
!
fn
)
{
strcpy
(
g
->
Message
,
"Missing http or filename"
);
//strcpy(g->Message, "Missing http or filename");
strcpy
(
m
,
"Missing http or filename"
);
return
2
;
}
// endif
if
(
xt
)
htrc
(
"restGetFile: fn=%s
\n
"
,
fn
);
fprintf
(
stderr
,
"restGetFile: fn=%s
\n
"
,
fn
);
// Open stream to output file.
pplx
::
task
<
void
>
requestTask
=
fstream
::
open_ostream
(
to_string_t
(
fn
))
...
...
@@ -42,7 +36,7 @@ int restGetFile(PGLOBAL g, PCSZ http, PCSZ uri, PCSZ fn)
*
fileStream
=
outFile
;
if
(
xt
)
htrc
(
"Outfile isopen=%d
\n
"
,
outFile
.
is_open
());
fprintf
(
stderr
,
"Outfile isopen=%d
\n
"
,
outFile
.
is_open
());
// Create http_client to send the request.
http_client
client
(
to_string_t
(
http
));
...
...
@@ -58,7 +52,7 @@ int restGetFile(PGLOBAL g, PCSZ http, PCSZ uri, PCSZ fn)
// Handle response headers arriving.
.
then
([
=
](
http_response
response
)
{
if
(
xt
)
htrc
(
"Received response status code:%u
\n
"
,
fprintf
(
stderr
,
"Received response status code:%u
\n
"
,
response
.
status_code
());
// Write response body into the file.
...
...
@@ -68,27 +62,27 @@ int restGetFile(PGLOBAL g, PCSZ http, PCSZ uri, PCSZ fn)
// Close the file stream.
.
then
([
=
](
size_t
n
)
{
if
(
xt
)
htrc
(
"Return size=%
u
\n
"
,
n
);
fprintf
(
stderr
,
"Return size=%z
u
\n
"
,
n
);
return
fileStream
->
close
();
});
// Wait for all the outstanding I/O to complete and handle any exceptions
try
{
requestTask
.
wait
();
if
(
xt
)
htrc
(
"In Wait
\n
"
);
fprintf
(
stderr
,
"Waiting
\n
"
);
requestTask
.
wait
();
}
catch
(
const
std
::
exception
&
e
)
{
if
(
xt
)
htrc
(
"Error exception: %s
\n
"
,
e
.
what
());
sprintf
(
g
->
Message
,
"Error exception: %s"
,
e
.
what
());
fprintf
(
stderr
,
"Error exception: %s
\n
"
,
e
.
what
());
sprintf
(
m
,
"Error exception: %s"
,
e
.
what
());
rc
=
1
;
}
// end try/catch
if
(
xt
)
htrc
(
"restget done: rc=%d
\n
"
,
rc
);
fprintf
(
stderr
,
"restget done: rc=%d
\n
"
,
rc
);
return
rc
;
}
// end of restGetFile
storage/connect/tabcmg.cpp
View file @
425437b2
...
...
@@ -56,22 +56,27 @@ bool CMGDISC::FindInDoc(PGLOBAL g, bson_iter_t *iter, const bson_t *doc,
char
colname
[
65
];
char
fmt
[
129
];
bool
newcol
;
size_t
n
;
while
(
bson_iter_next
(
iter
))
{
key
=
bson_iter_key
(
iter
);
newcol
=
true
;
if
(
pcn
)
{
strncpy
(
colname
,
pcn
,
64
);
colname
[
64
]
=
0
;
strncat
(
strncat
(
colname
,
"_"
,
65
),
key
,
65
);
n
=
sizeof
(
colname
)
-
1
;
strncpy
(
colname
,
pcn
,
n
);
colname
[
n
]
=
0
;
n
-=
strlen
(
colname
);
strncat
(
strncat
(
colname
,
"_"
,
n
),
key
,
n
-
1
);
}
else
strcpy
(
colname
,
key
);
if
(
pfmt
)
{
strncpy
(
fmt
,
pfmt
,
128
);
fmt
[
128
]
=
0
;
strncat
(
strncat
(
fmt
,
"."
,
129
),
key
,
129
);
n
=
sizeof
(
fmt
)
-
1
;
strncpy
(
fmt
,
pfmt
,
n
);
fmt
[
n
]
=
0
;
n
-=
strlen
(
fmt
);
strncat
(
strncat
(
fmt
,
"."
,
n
),
key
,
n
-
1
);
}
else
strcpy
(
fmt
,
key
);
...
...
storage/connect/tabdos.cpp
View file @
425437b2
...
...
@@ -45,7 +45,7 @@
#include "global.h"
#include "osutil.h"
#include "plgdbsem.h"
#include "catalog.h"
//
#include "catalog.h"
#include "mycat.h"
#include "xindex.h"
#include "filamap.h"
...
...
@@ -161,6 +161,11 @@ bool DOSDEF::DefineAM(PGLOBAL g, LPCSTR am, int)
//Last = GetIntCatInfo("Last", 0);
Ending
=
GetIntCatInfo
(
"Ending"
,
CRLF
);
if
(
Ending
<=
0
)
{
Ending
=
(
Recfm
==
RECFM_BIN
||
Recfm
==
RECFM_VCT
)
?
0
:
CRLF
;
SetIntCatInfo
(
"Ending"
,
Ending
);
}
// endif ending
if
(
Recfm
==
RECFM_FIX
||
Recfm
==
RECFM_BIN
)
{
Huge
=
GetBoolCatInfo
(
"Huge"
,
Cat
->
GetDefHuge
());
Padded
=
GetBoolCatInfo
(
"Padded"
,
false
);
...
...
@@ -191,6 +196,7 @@ bool DOSDEF::GetOptFileName(PGLOBAL g, char *filename)
case
RECFM_FIX
:
ftype
=
".fop"
;
break
;
case
RECFM_BIN
:
ftype
=
".bop"
;
break
;
case
RECFM_VCT
:
ftype
=
".vop"
;
break
;
case
RECFM_CSV
:
ftype
=
".cop"
;
break
;
case
RECFM_DBF
:
ftype
=
".dbp"
;
break
;
default:
sprintf
(
g
->
Message
,
MSG
(
INVALID_FTYPE
),
Recfm
);
...
...
@@ -261,6 +267,7 @@ bool DOSDEF::DeleteIndexFile(PGLOBAL g, PIXDEF pxdf)
case
RECFM_FIX
:
ftype
=
".fnx"
;
break
;
case
RECFM_BIN
:
ftype
=
".bnx"
;
break
;
case
RECFM_VCT
:
ftype
=
".vnx"
;
break
;
case
RECFM_CSV
:
ftype
=
".cnx"
;
break
;
case
RECFM_DBF
:
ftype
=
".dbx"
;
break
;
default:
sprintf
(
g
->
Message
,
MSG
(
BAD_RECFM_VAL
),
Recfm
);
...
...
@@ -2257,7 +2264,7 @@ int TDBDOS::ReadDB(PGLOBAL g)
/***********************************************************************/
bool
TDBDOS
::
PrepareWriting
(
PGLOBAL
)
{
if
(
!
Ftype
&&
(
Mode
==
MODE_INSERT
||
Txfp
->
GetUseTemp
()))
{
if
(
Ftype
==
RECFM_VAR
&&
(
Mode
==
MODE_INSERT
||
Txfp
->
GetUseTemp
()))
{
char
*
p
;
/*******************************************************************/
...
...
@@ -2542,7 +2549,8 @@ void DOSCOL::ReadColumn(PGLOBAL g)
/*********************************************************************/
/* For a variable length file, check if the field exists. */
/*********************************************************************/
if
(
tdbp
->
Ftype
==
RECFM_VAR
&&
strlen
(
tdbp
->
To_Line
)
<
(
unsigned
)
Deplac
)
if
((
tdbp
->
Ftype
==
RECFM_VAR
||
tdbp
->
Ftype
==
RECFM_CSV
)
&&
strlen
(
tdbp
->
To_Line
)
<
(
unsigned
)
Deplac
)
field
=
0
;
else
if
(
Dsp
)
for
(
i
=
0
;
i
<
field
;
i
++
)
...
...
@@ -2552,6 +2560,7 @@ void DOSCOL::ReadColumn(PGLOBAL g)
switch
(
tdbp
->
Ftype
)
{
case
RECFM_VAR
:
case
RECFM_FIX
:
// Fixed length text file
case
RECFM_CSV
:
// Variable length CSV or FMT file
case
RECFM_DBF
:
// Fixed length DBase file
if
(
Nod
)
switch
(
Buf_Type
)
{
case
TYPE_INT
:
...
...
storage/connect/tabdos.h
View file @
425437b2
...
...
@@ -80,7 +80,6 @@ class DllExport DOSDEF : public TABDEF { /* Logical table description */
PCSZ
Entry
;
/* Zip entry name or pattern */
PCSZ
Pwd
;
/* Zip password */
PIXDEF
To_Indx
;
/* To index definitions blocks */
RECFM
Recfm
;
/* 0:VAR, 1:FIX, 2:BIN, 3:VCT, 6:DBF */
bool
Mapped
;
/* 0: disk file, 1: memory mapped file */
bool
Zipped
;
/* true for zipped table file */
bool
Mulentries
;
/* true for multiple entries */
...
...
storage/connect/tabfix.cpp
View file @
425437b2
...
...
@@ -84,7 +84,7 @@ PTDB TDBFIX::Clone(PTABS t)
tp
=
new
(
g
)
TDBFIX
(
g
,
this
);
if
(
Ftype
<
2
)
{
if
(
Ftype
==
RECFM_VAR
||
Ftype
==
RECFM_FIX
)
{
// File is text
PDOSCOL
cp1
,
cp2
;
...
...
storage/connect/tabfmt.cpp
View file @
425437b2
/************* TabFmt C++ Program Source Code File (.CPP) **************/
/* PROGRAM NAME: TABFMT */
/* ------------- */
/* Version 3.9.
2
*/
/* Version 3.9.
3
*/
/* */
/* COPYRIGHT: */
/* ---------- */
/* (C) Copyright to the author Olivier BERTRAND 2001 - 201
7
*/
/* (C) Copyright to the author Olivier BERTRAND 2001 - 201
9
*/
/* */
/* WHAT THIS PROGRAM DOES: */
/* ----------------------- */
...
...
@@ -477,6 +477,7 @@ bool CSVDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff)
if
(
DOSDEF
::
DefineAM
(
g
,
"CSV"
,
poff
))
return
true
;
Recfm
=
RECFM_CSV
;
GetCharCatInfo
(
"Separator"
,
","
,
buf
,
sizeof
(
buf
));
Sep
=
(
strlen
(
buf
)
==
2
&&
buf
[
0
]
==
'\\'
&&
buf
[
1
]
==
't'
)
?
'\t'
:
*
buf
;
Quoted
=
GetIntCatInfo
(
"Quoted"
,
-
1
);
...
...
storage/connect/tabjson.cpp
View file @
425437b2
...
...
@@ -396,6 +396,7 @@ bool JSONDISC::Find(PGLOBAL g, PJVAL jvp, PCSZ key, int j)
{
char
*
p
,
*
pc
=
colname
+
strlen
(
colname
);
int
ars
;
size_t
n
;
PJOB
job
;
PJAR
jar
;
...
...
@@ -423,8 +424,10 @@ bool JSONDISC::Find(PGLOBAL g, PJVAL jvp, PCSZ key, int j)
PCSZ
k
=
jrp
->
GetKey
();
if
(
*
k
!=
'$'
)
{
strncat
(
strncat
(
fmt
,
sep
,
128
),
k
,
128
);
strncat
(
strncat
(
colname
,
"_"
,
64
),
k
,
64
);
n
=
sizeof
(
fmt
)
-
strlen
(
fmt
)
-
1
;
strncat
(
strncat
(
fmt
,
sep
,
n
),
k
,
n
-
strlen
(
sep
));
n
=
sizeof
(
colname
)
-
strlen
(
colname
)
-
1
;
strncat
(
strncat
(
colname
,
"_"
,
n
),
k
,
n
-
1
);
}
// endif Key
if
(
Find
(
g
,
jrp
->
GetVal
(),
k
,
j
+
1
))
...
...
@@ -443,19 +446,26 @@ bool JSONDISC::Find(PGLOBAL g, PJVAL jvp, PCSZ key, int j)
ars
=
MY_MIN
(
jar
->
GetSize
(
false
),
1
);
for
(
int
k
=
0
;
k
<
ars
;
k
++
)
{
n
=
sizeof
(
fmt
)
-
(
strlen
(
fmt
)
+
1
);
if
(
!
tdp
->
Xcol
||
stricmp
(
tdp
->
Xcol
,
key
))
{
sprintf
(
buf
,
"%d"
,
k
);
if
(
tdp
->
Uri
)
strncat
(
strncat
(
fmt
,
sep
,
128
),
buf
,
128
);
else
strncat
(
strncat
(
strncat
(
fmt
,
"["
,
128
),
buf
,
128
),
"]"
,
128
);
if
(
tdp
->
Uri
)
{
strncat
(
strncat
(
fmt
,
sep
,
n
),
buf
,
n
-
strlen
(
sep
));
}
else
{
strncat
(
strncat
(
fmt
,
"["
,
n
),
buf
,
n
-
1
);
strncat
(
fmt
,
"]"
,
n
-
(
strlen
(
buf
)
+
1
));
}
// endif uri
if
(
all
)
strncat
(
strncat
(
colname
,
"_"
,
64
),
buf
,
64
);
if
(
all
)
{
n
=
sizeof
(
colname
)
-
(
strlen
(
colname
)
+
1
);
strncat
(
strncat
(
colname
,
"_"
,
n
),
buf
,
n
-
1
);
}
// endif all
}
else
strncat
(
fmt
,
(
tdp
->
Uri
?
sep
:
"[*]"
),
128
);
}
else
{
strncat
(
fmt
,
(
tdp
->
Uri
?
sep
:
"[*]"
),
n
);
}
if
(
Find
(
g
,
jar
->
GetValue
(
k
),
""
,
j
))
return
true
;
...
...
storage/connect/tabmysql.cpp
View file @
425437b2
...
...
@@ -342,11 +342,13 @@ bool MYSQLDEF::DefineAM(PGLOBAL g, LPCSTR am, int)
Delayed
=
!!
GetIntCatInfo
(
"Delayed"
,
0
);
}
else
{
// MYSQL access from a PROXY table
TABLE_SHARE
*
s
;
Tabschema
=
GetStringCatInfo
(
g
,
"Database"
,
Tabschema
?
Tabschema
:
PlugDup
(
g
,
"*"
));
Isview
=
GetBoolCatInfo
(
"View"
,
false
);
// We must get other connection parms from the calling table
Remove_tshp
(
Cat
);
s
=
Remove_tshp
(
Cat
);
url
=
GetStringCatInfo
(
g
,
"Connect"
,
NULL
);
if
(
!
url
||
!*
url
)
{
...
...
@@ -365,6 +367,9 @@ bool MYSQLDEF::DefineAM(PGLOBAL g, LPCSTR am, int)
}
// endif url
Tabname
=
Name
;
// Needed for column description
Restore_tshp
(
Cat
,
s
);
}
// endif am
if
((
Srcdef
=
GetStringCatInfo
(
g
,
"Srcdef"
,
NULL
)))
{
...
...
storage/connect/tabrest.cpp
View file @
425437b2
/*************** Rest C++ Program Source Code File (.CPP) **************/
/* PROGRAM NAME: Rest Version 1.
5
*/
/* PROGRAM NAME: Rest Version 1.
6
*/
/* (C) Copyright to the author Olivier BERTRAND 2018 - 2019 */
/* This program is the REST Web API support for MariaDB. */
/* When compiled without MARIADB defined, it is the EOM module code. */
...
...
@@ -36,17 +36,7 @@
#include "tabfmt.h"
#include "tabrest.h"
/***********************************************************************/
/* Get the file from the Web. */
/***********************************************************************/
int
restGetFile
(
PGLOBAL
g
,
PCSZ
http
,
PCSZ
uri
,
PCSZ
fn
);
#if defined(__WIN__)
static
PCSZ
slash
=
"
\\
"
;
#else // !__WIN__
static
PCSZ
slash
=
"/"
;
#define stricmp strcasecmp
#endif // !__WIN__
static
XGETREST
getRestFnc
=
NULL
;
#if !defined(MARIADB)
/***********************************************************************/
...
...
@@ -75,6 +65,74 @@ PTABDEF __stdcall GetREST(PGLOBAL g, void *memp)
}
// end of GetREST
#endif // !MARIADB
/***********************************************************************/
/* GetREST: get the external TABDEF from OEM module. */
/***********************************************************************/
XGETREST
GetRestFunction
(
PGLOBAL
g
)
{
if
(
getRestFnc
)
return
getRestFnc
;
#if !defined(REST_SOURCE)
if
(
trace
(
515
))
htrc
(
"Looking for GetRest library
\n
"
);
#if defined(__WIN__)
HANDLE
Hdll
;
const
char
*
soname
=
"GetRest.dll"
;
// Module name
if
(
!
(
Hdll
=
LoadLibrary
(
soname
)))
{
char
buf
[
256
];
DWORD
rc
=
GetLastError
();
sprintf
(
g
->
Message
,
MSG
(
DLL_LOAD_ERROR
),
rc
,
soname
);
FormatMessage
(
FORMAT_MESSAGE_FROM_SYSTEM
|
FORMAT_MESSAGE_IGNORE_INSERTS
,
NULL
,
rc
,
0
,
(
LPTSTR
)
buf
,
sizeof
(
buf
),
NULL
);
strcat
(
strcat
(
g
->
Message
,
": "
),
buf
);
return
NULL
;
}
// endif Hdll
// Get the function returning an instance of the external DEF class
if
(
!
(
getRestFnc
=
(
XGETREST
)
GetProcAddress
((
HINSTANCE
)
Hdll
,
"restGetFile"
)))
{
char
buf
[
256
];
DWORD
rc
=
GetLastError
();
sprintf
(
g
->
Message
,
MSG
(
PROCADD_ERROR
),
rc
,
"restGetFile"
);
FormatMessage
(
FORMAT_MESSAGE_FROM_SYSTEM
|
FORMAT_MESSAGE_IGNORE_INSERTS
,
NULL
,
rc
,
0
,
(
LPTSTR
)
buf
,
sizeof
(
buf
),
NULL
);
strcat
(
strcat
(
g
->
Message
,
": "
),
buf
);
FreeLibrary
((
HMODULE
)
Hdll
);
return
NULL
;
}
// endif getRestFnc
#else // !__WIN__
void
*
Hso
;
const
char
*
error
=
NULL
;
const
char
*
soname
=
"GetRest.so"
;
// Module name
// Load the desired shared library
if
(
!
(
Hso
=
dlopen
(
soname
,
RTLD_LAZY
)))
{
error
=
dlerror
();
sprintf
(
g
->
Message
,
MSG
(
SHARED_LIB_ERR
),
soname
,
SVP
(
error
));
return
NULL
;
}
// endif Hdll
// Get the function returning an instance of the external DEF class
if
(
!
(
getRestFnc
=
(
XGETREST
)
dlsym
(
Hso
,
"restGetFile"
)))
{
error
=
dlerror
();
sprintf
(
g
->
Message
,
MSG
(
GET_FUNC_ERR
),
"restGetFile"
,
SVP
(
error
));
dlclose
(
Hso
);
return
NULL
;
}
// endif getdef
#endif // !__WIN__
#else
getRestFnc
=
restGetFile
;
#endif
return
getRestFnc
;
}
// end of GetRestFunction
/***********************************************************************/
/* Return the columns definition to MariaDB. */
/***********************************************************************/
...
...
@@ -87,6 +145,10 @@ PQRYRES __stdcall ColREST(PGLOBAL g, PTOS tp, char *tab, char *db, bool info)
PQRYRES
qrp
=
NULL
;
char
filename
[
_MAX_PATH
+
1
];
// MAX PATH ???
PCSZ
http
,
uri
,
fn
,
ftype
;
XGETREST
grf
=
GetRestFunction
(
g
);
if
(
!
grf
)
return
NULL
;
http
=
GetStringTableOption
(
g
,
tp
,
"Http"
,
NULL
);
uri
=
GetStringTableOption
(
g
,
tp
,
"Uri"
,
NULL
);
...
...
@@ -100,10 +162,10 @@ PQRYRES __stdcall ColREST(PGLOBAL g, PTOS tp, char *tab, char *db, bool info)
// We used the file name relative to recorded datapath
strcat
(
strcat
(
strcat
(
strcpy
(
filename
,
"."
),
slash
),
db
),
slash
);
strncat
(
filename
,
fn
,
_MAX_PATH
);
strncat
(
filename
,
fn
,
_MAX_PATH
-
strlen
(
filename
)
);
// Retrieve the file from the web and copy it locally
if
(
http
&&
restGetFile
(
g
,
http
,
uri
,
filename
))
{
if
(
http
&&
grf
(
g
->
Message
,
trace
(
515
)
,
http
,
uri
,
filename
))
{
// sprintf(g->Message, "Failed to get file at %s", http);
}
else
if
(
!
stricmp
(
ftype
,
"XML"
))
qrp
=
XMLColumns
(
g
,
db
,
tab
,
tp
,
info
);
...
...
@@ -126,7 +188,12 @@ bool RESTDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff)
{
char
filename
[
_MAX_PATH
+
1
];
int
rc
=
0
,
n
;
bool
xt
=
trace
(
515
);
LPCSTR
ftype
;
XGETREST
grf
=
GetRestFunction
(
g
);
if
(
!
grf
)
return
true
;
#if defined(MARIADB)
ftype
=
GetStringCatInfo
(
g
,
"Type"
,
"JSON"
);
...
...
@@ -135,7 +202,7 @@ bool RESTDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff)
ftype
=
GetStringCatInfo
(
g
,
"Ftype"
,
"JSON"
);
#endif // !MARIADB
if
(
trace
(
515
)
)
if
(
xt
)
htrc
(
"ftype = %s am = %s
\n
"
,
ftype
,
SVP
(
am
));
n
=
(
!
stricmp
(
ftype
,
"JSON"
))
?
1
...
...
@@ -154,12 +221,13 @@ bool RESTDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff)
// We used the file name relative to recorded datapath
//PlugSetPath(filename, Fn, GetPath());
strncat
(
strcpy
(
filename
,
GetPath
()),
Fn
,
_MAX_PATH
);
strcpy
(
filename
,
GetPath
());
strncat
(
filename
,
Fn
,
_MAX_PATH
-
strlen
(
filename
));
// Retrieve the file from the web and copy it locally
rc
=
restGetFile
(
g
,
Http
,
Uri
,
filename
);
rc
=
grf
(
g
->
Message
,
xt
,
Http
,
Uri
,
filename
);
if
(
trace
(
515
)
)
if
(
xt
)
htrc
(
"Return from restGetFile: rc=%d
\n
"
,
rc
);
if
(
rc
)
...
...
@@ -175,7 +243,7 @@ bool RESTDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff)
if
(
Tdp
&&
Tdp
->
Define
(
g
,
Cat
,
Name
,
Schema
,
"REST"
))
Tdp
=
NULL
;
// Error occured
if
(
trace
(
515
)
)
if
(
xt
)
htrc
(
"Tdp defined
\n
"
,
rc
);
// Return true in case of error
...
...
storage/connect/tabrest.h
View file @
425437b2
...
...
@@ -5,6 +5,25 @@
/***********************************************************************/
#pragma once
#if defined(__WIN__)
static
PCSZ
slash
=
"
\\
"
;
#else // !__WIN__
static
PCSZ
slash
=
"/"
;
#define stricmp strcasecmp
#endif // !__WIN__
typedef
int
(
__stdcall
*
XGETREST
)
(
char
*
,
bool
,
PCSZ
,
PCSZ
,
PCSZ
);
/***********************************************************************/
/* Functions used by REST. */
/***********************************************************************/
XGETREST
GetRestFunction
(
PGLOBAL
g
);
int
restGetFile
(
char
*
m
,
bool
x
,
PCSZ
http
,
PCSZ
uri
,
PCSZ
fn
);
#if defined(MARIADB)
PQRYRES
RESTColumns
(
PGLOBAL
g
,
PTOS
tp
,
char
*
tab
,
char
*
db
,
bool
info
);
#endif // !MARIADB
/***********************************************************************/
/* Restest table. */
/***********************************************************************/
...
...
storage/connect/tabutil.cpp
View file @
425437b2
...
...
@@ -59,11 +59,23 @@ int GetConvSize(void);
/* Used by MYSQL tables to get MySQL parameters from the calling proxy */
/* table (PROXY, TBL, XCL, or OCCUR) when used by one of these. */
/************************************************************************/
void
Remove_tshp
(
PCATLG
cat
)
TABLE_SHARE
*
Remove_tshp
(
PCATLG
cat
)
{
TABLE_SHARE
*
s
=
((
MYCAT
*
)
cat
)
->
GetHandler
()
->
tshp
;
((
MYCAT
*
)
cat
)
->
GetHandler
()
->
tshp
=
NULL
;
return
s
;
}
// end of Remove_thsp
/************************************************************************/
/* Used by MYSQL tables to get MySQL parameters from the calling proxy */
/* table (PROXY, TBL, XCL, or OCCUR) when used by one of these. */
/************************************************************************/
void
Restore_tshp
(
PCATLG
cat
,
TABLE_SHARE
*
s
)
{
((
MYCAT
*
)
cat
)
->
GetHandler
()
->
tshp
=
s
;
}
// end of Restore_thsp
/************************************************************************/
/* GetTableShare: allocates and open a table share. */
/************************************************************************/
...
...
storage/connect/tabutil.h
View file @
425437b2
...
...
@@ -18,7 +18,8 @@ TABLE_SHARE *GetTableShare(PGLOBAL g, THD *thd, const char *db,
PQRYRES
TabColumns
(
PGLOBAL
g
,
THD
*
thd
,
const
char
*
db
,
const
char
*
name
,
bool
&
info
);
void
Remove_tshp
(
PCATLG
cat
);
TABLE_SHARE
*
Remove_tshp
(
PCATLG
cat
);
void
Restore_tshp
(
PCATLG
cat
,
TABLE_SHARE
*
s
);
/* -------------------------- PROXY classes -------------------------- */
...
...
storage/connect/tabvct.cpp
View file @
425437b2
...
...
@@ -115,11 +115,14 @@ bool VCTDEF::DefineAM(PGLOBAL g, LPCSTR, int poff)
Recfm
=
RECFM_VCT
;
// poff is no more in use; This will have to be revisited
#if 0
// For packed files the logical record length is calculated in poff
if (poff != Lrecl) {
Lrecl = poff;
SetIntCatInfo("Lrecl", poff);
} // endif poff
#endif // 0
Padded
=
false
;
Blksize
=
0
;
...
...
storage/connect/tabxml.cpp
View file @
425437b2
...
...
@@ -240,7 +240,9 @@ PQRYRES XMLColumns(PGLOBAL g, char *db, char *tab, PTOS topt, bool info)
more:
if
(
vp
->
atp
)
{
strncpy
(
colname
,
vp
->
atp
->
GetName
(
g
),
sizeof
(
colname
));
size_t
z
=
sizeof
(
colname
)
-
1
;
strncpy
(
colname
,
vp
->
atp
->
GetName
(
g
),
z
);
colname
[
z
]
=
0
;
strncat
(
xcol
->
Name
,
colname
,
XLEN
(
xcol
->
Name
));
switch
(
vp
->
atp
->
GetText
(
g
,
buf
,
sizeof
(
buf
)))
{
...
...
storage/connect/xindex.cpp
View file @
425437b2
...
...
@@ -659,7 +659,7 @@ bool XINDEX::Make(PGLOBAL g, PIXDEF sxp)
/* Not true for DBF tables because of eventual soft deleted lines. */
/* Note: for Num_K = 1 any non null value is Ok. */
/*********************************************************************/
if
(
Srtd
&&
!
filp
&&
Tdbp
->
Ftype
!=
RECFM_VAR
if
(
Srtd
&&
!
filp
&&
Tdbp
->
Ftype
!=
RECFM_VAR
&&
Tdbp
->
Ftype
!=
RECFM_CSV
&&
Tdbp
->
Txfp
->
GetAmType
()
!=
TYPE_AM_DBF
)
{
Incr
=
(
Num_K
>
1
)
?
To_Rec
[
1
]
:
Num_K
;
PlgDBfree
(
Record
);
...
...
@@ -837,6 +837,7 @@ bool XINDEX::SaveIndex(PGLOBAL g, PIXDEF sxp)
case
RECFM_FIX
:
ftype
=
".fnx"
;
break
;
case
RECFM_BIN
:
ftype
=
".bnx"
;
break
;
case
RECFM_VCT
:
ftype
=
".vnx"
;
break
;
case
RECFM_CSV
:
ftype
=
".cnx"
;
break
;
case
RECFM_DBF
:
ftype
=
".dbx"
;
break
;
default:
sprintf
(
g
->
Message
,
MSG
(
INVALID_FTYPE
),
Tdbp
->
Ftype
);
...
...
@@ -990,6 +991,7 @@ bool XINDEX::Init(PGLOBAL g)
case
RECFM_FIX
:
ftype
=
".fnx"
;
break
;
case
RECFM_BIN
:
ftype
=
".bnx"
;
break
;
case
RECFM_VCT
:
ftype
=
".vnx"
;
break
;
case
RECFM_CSV
:
ftype
=
".cnx"
;
break
;
case
RECFM_DBF
:
ftype
=
".dbx"
;
break
;
default:
sprintf
(
g
->
Message
,
MSG
(
INVALID_FTYPE
),
Tdbp
->
Ftype
);
...
...
@@ -1243,6 +1245,7 @@ bool XINDEX::MapInit(PGLOBAL g)
case
RECFM_FIX
:
ftype
=
".fnx"
;
break
;
case
RECFM_BIN
:
ftype
=
".bnx"
;
break
;
case
RECFM_VCT
:
ftype
=
".vnx"
;
break
;
case
RECFM_CSV
:
ftype
=
".cnx"
;
break
;
case
RECFM_DBF
:
ftype
=
".dbx"
;
break
;
default:
sprintf
(
g
->
Message
,
MSG
(
INVALID_FTYPE
),
Tdbp
->
Ftype
);
...
...
@@ -1457,6 +1460,7 @@ bool XINDEX::GetAllSizes(PGLOBAL g,/* int &ndif,*/ int &numk)
case
RECFM_FIX
:
ftype
=
".fnx"
;
break
;
case
RECFM_BIN
:
ftype
=
".bnx"
;
break
;
case
RECFM_VCT
:
ftype
=
".vnx"
;
break
;
case
RECFM_CSV
:
ftype
=
".cnx"
;
break
;
case
RECFM_DBF
:
ftype
=
".dbx"
;
break
;
default:
sprintf
(
g
->
Message
,
MSG
(
INVALID_FTYPE
),
Tdbp
->
Ftype
);
...
...
storage/connect/xtable.h
View file @
425437b2
...
...
@@ -173,9 +173,12 @@ class DllExport TDBASE : public TDB {
inline
void
SetKindex
(
PKXBASE
kxp
)
{
To_Kindex
=
kxp
;}
// Properties
virtual
PKXBASE
GetKindex
(
void
)
{
return
To_Kindex
;}
PKXBASE
GetKindex
(
void
)
{
return
To_Kindex
;}
PXOB
*
GetLink
(
void
)
{
return
To_Link
;}
PIXDEF
GetXdp
(
void
)
{
return
To_Xdp
;}
void
ResetKindex
(
PGLOBAL
g
,
PKXBASE
kxp
);
PCOL
Key
(
int
i
)
{
return
(
To_Key_Col
)
?
To_Key_Col
[
i
]
:
NULL
;}
PXOB
Link
(
int
i
)
{
return
(
To_Link
)
?
To_Link
[
i
]
:
NULL
;
}
// Methods
virtual
bool
IsUsingTemp
(
PGLOBAL
)
{
return
false
;}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment