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
b9c89ad0
Commit
b9c89ad0
authored
May 05, 2015
by
Sergei Golubchik
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'Buggynours:10.0' into 10.0
parents
95797b96
a82f475b
Changes
17
Hide whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
303 additions
and
116 deletions
+303
-116
storage/connect/global.h
storage/connect/global.h
+1
-1
storage/connect/ha_connect.cc
storage/connect/ha_connect.cc
+31
-40
storage/connect/jsonudf.cpp
storage/connect/jsonudf.cpp
+80
-14
storage/connect/mysql-test/connect/r/json.result
storage/connect/mysql-test/connect/r/json.result
+6
-6
storage/connect/mysql-test/connect/r/xml_html.result
storage/connect/mysql-test/connect/r/xml_html.result
+32
-0
storage/connect/mysql-test/connect/std_data/beers.xml
storage/connect/mysql-test/connect/std_data/beers.xml
+16
-0
storage/connect/mysql-test/connect/std_data/coffee.htm
storage/connect/mysql-test/connect/std_data/coffee.htm
+24
-0
storage/connect/mysql-test/connect/t/json_udf.inc
storage/connect/mysql-test/connect/t/json_udf.inc
+36
-36
storage/connect/mysql-test/connect/t/xml_html.test
storage/connect/mysql-test/connect/t/xml_html.test
+39
-0
storage/connect/tabjson.cpp
storage/connect/tabjson.cpp
+18
-3
storage/connect/tabjson.h
storage/connect/tabjson.h
+2
-1
storage/connect/tabmul.cpp
storage/connect/tabmul.cpp
+4
-2
storage/connect/tabmysql.cpp
storage/connect/tabmysql.cpp
+9
-2
storage/connect/tabtbl.cpp
storage/connect/tabtbl.cpp
+1
-1
storage/connect/tabutil.cpp
storage/connect/tabutil.cpp
+0
-7
storage/connect/tabxml.cpp
storage/connect/tabxml.cpp
+3
-2
storage/connect/value.cpp
storage/connect/value.cpp
+1
-1
No files found.
storage/connect/global.h
View file @
b9c89ad0
...
...
@@ -118,7 +118,7 @@ extern "C" {
/* Static variables */
/***********************************************************************/
#if defined(STORAGE)
char
sys_stamp
[
4
]
=
SYS_STAMP
;
char
sys_stamp
[
5
]
=
SYS_STAMP
;
#else
extern
char
sys_stamp
[];
#endif
...
...
storage/connect/ha_connect.cc
View file @
b9c89ad0
...
...
@@ -168,35 +168,21 @@
#define JSONMAX 10 // JSON Default max grp size
extern
"C"
{
char
version
[]
=
"Version 1.03.0006 April 12, 2015"
;
char
version
[]
=
"Version 1.03.0007 April 30, 2015"
;
#if defined(WIN32)
char
compver
[]
=
"Version 1.03.000
6
"
__DATE__
" "
__TIME__
;
char
compver
[]
=
"Version 1.03.000
7
"
__DATE__
" "
__TIME__
;
char
slash
=
'\\'
;
#else // !WIN32
char
slash
=
'/'
;
#endif // !WIN32
// int trace= 0; // The general trace value
// ulong xconv= 0; // The type conversion option
// int zconv= 0; // The text conversion size
}
// extern "C"
#if defined(XMAP)
my_bool
xmap
=
false
;
#endif // XMAP
// uint worksize= 0;
ulong
ha_connect
::
num
=
0
;
//int DTVAL::Shift= 0;
/* CONNECT system variables */
//atic int conv_size= 0;
//atic uint work_size= 0;
//atic ulong type_conv= 0;
#if defined(XMAP)
//atic my_bool indx_map= 0;
#endif // XMAP
#if defined(XMSG)
extern
"C"
{
char
*
msg_path
;
...
...
@@ -613,9 +599,9 @@ DllExport LPCSTR PlugSetPath(LPSTR to, LPCSTR name, LPCSTR dir)
delete_table method in handler.cc
*/
static
const
char
*
ha_connect_exts
[]
=
{
".dos"
,
".fix"
,
".csv"
,
".bin"
,
".fmt"
,
".dbf"
,
".xml"
,
".
ini"
,
".vec
"
,
".
dnx"
,
".fnx"
,
".bnx"
,
".vnx"
,
".dbx"
,
".dop"
,
".fop"
,
".bop"
,
".v
op"
,
NULL
};
".dos"
,
".fix"
,
".csv"
,
".bin"
,
".fmt"
,
".dbf"
,
".xml"
,
".
json"
,
".ini
"
,
".
vec"
,
".dnx"
,
".fnx"
,
".bnx"
,
".vnx"
,
".dbx"
,
".dop"
,
".fop"
,
".b
op"
,
".vop"
,
NULL
};
/**
@brief
...
...
@@ -4646,8 +4632,13 @@ int ha_connect::delete_or_rename_table(const char *name, const char *to)
}
// endif pos
}
else
// Avoid infamous DBUG_ASSERT
thd
->
get_stmt_da
()
->
reset_diagnostics_area
();
}
// endif open_table_def
// This below was done to avoid DBUG_ASSERT in some case that
// we don't know anymore what they were. It was suppressed because
// it did cause assertion in other cases (see MDEV-7935)
// } else // Avoid infamous DBUG_ASSERT
// thd->get_stmt_da()->reset_diagnostics_area();
free_table_share
(
share
);
}
else
// Temporary file
...
...
@@ -4730,6 +4721,25 @@ ha_rows ha_connect::records_in_range(uint inx, key_range *min_key,
DBUG_RETURN
(
rows
);
}
// end of records_in_range
// Used to check whether a MYSQL table is created on itself
bool
CheckSelf
(
PGLOBAL
g
,
TABLE_SHARE
*
s
,
const
char
*
host
,
const
char
*
db
,
char
*
tab
,
const
char
*
src
,
int
port
)
{
if
(
src
)
return
false
;
else
if
(
host
&&
stricmp
(
host
,
"localhost"
)
&&
strcmp
(
host
,
"127.0.0.1"
))
return
false
;
else
if
(
db
&&
stricmp
(
db
,
s
->
db
.
str
))
return
false
;
else
if
(
tab
&&
stricmp
(
tab
,
s
->
table_name
.
str
))
return
false
;
else
if
(
port
&&
port
!=
(
signed
)
GetDefaultPort
())
return
false
;
strcpy
(
g
->
Message
,
"This MySQL table is defined on itself"
);
return
true
;
}
// end of CheckSelf
/**
Convert an ISO-8859-1 column name to UTF-8
*/
...
...
@@ -4933,25 +4943,6 @@ static int init_table_share(THD* thd,
sql
->
ptr
(),
sql
->
length
());
}
// end of init_table_share
// Used to check whether a MYSQL table is created on itself
bool
CheckSelf
(
PGLOBAL
g
,
TABLE_SHARE
*
s
,
const
char
*
host
,
const
char
*
db
,
char
*
tab
,
const
char
*
src
,
int
port
)
{
if
(
src
)
return
false
;
else
if
(
host
&&
stricmp
(
host
,
"localhost"
)
&&
strcmp
(
host
,
"127.0.0.1"
))
return
false
;
else
if
(
db
&&
stricmp
(
db
,
s
->
db
.
str
))
return
false
;
else
if
(
tab
&&
stricmp
(
tab
,
s
->
table_name
.
str
))
return
false
;
else
if
(
port
&&
port
!=
(
signed
)
GetDefaultPort
())
return
false
;
strcpy
(
g
->
Message
,
"This MySQL table is defined on itself"
);
return
true
;
}
// end of CheckSelf
/**
@brief
connect_assisted_discovery() is called when creating a table with no columns.
...
...
storage/connect/jsonudf.cpp
View file @
b9c89ad0
...
...
@@ -17,40 +17,45 @@
#include "json.h"
#define MEMFIX 512
#define UDF_EXEC_ARGS \
UDF_INIT*, UDF_ARGS*, char*, unsigned long*, char*, char*
uint
GetJsonGrpSize
(
void
);
extern
"C"
{
DllExport
my_bool
Json_Value_init
(
UDF_INIT
*
,
UDF_ARGS
*
,
char
*
);
DllExport
char
*
Json_Value
(
UDF_INIT
*
,
UDF_ARGS
*
,
char
*
,
unsigned
long
*
,
char
*
,
char
*
);
DllExport
char
*
Json_Value
(
UDF_EXEC_ARGS
);
DllExport
void
Json_Value_deinit
(
UDF_INIT
*
);
DllExport
my_bool
Json_Array_init
(
UDF_INIT
*
,
UDF_ARGS
*
,
char
*
);
DllExport
char
*
Json_Array
(
UDF_INIT
*
,
UDF_ARGS
*
,
char
*
,
unsigned
long
*
,
char
*
,
char
*
);
DllExport
char
*
Json_Array
(
UDF_EXEC_ARGS
);
DllExport
void
Json_Array_deinit
(
UDF_INIT
*
);
DllExport
my_bool
Json_Array_Add_init
(
UDF_INIT
*
,
UDF_ARGS
*
,
char
*
);
DllExport
char
*
Json_Array_Add
(
UDF_INIT
*
,
UDF_ARGS
*
,
char
*
,
unsigned
long
*
,
char
*
,
char
*
);
DllExport
char
*
Json_Array_Add
(
UDF_EXEC_ARGS
);
DllExport
void
Json_Array_Add_deinit
(
UDF_INIT
*
);
DllExport
my_bool
Json_Array_Delete_init
(
UDF_INIT
*
,
UDF_ARGS
*
,
char
*
);
DllExport
char
*
Json_Array_Delete
(
UDF_EXEC_ARGS
);
DllExport
void
Json_Array_Delete_deinit
(
UDF_INIT
*
);
DllExport
my_bool
Json_Object_init
(
UDF_INIT
*
,
UDF_ARGS
*
,
char
*
);
DllExport
char
*
Json_Object
(
UDF_INIT
*
,
UDF_ARGS
*
,
char
*
,
unsigned
long
*
,
char
*
,
char
*
);
DllExport
char
*
Json_Object
(
UDF_EXEC_ARGS
);
DllExport
void
Json_Object_deinit
(
UDF_INIT
*
);
DllExport
my_bool
Json_Object_Nonull_init
(
UDF_INIT
*
,
UDF_ARGS
*
,
char
*
);
DllExport
char
*
Json_Object_Nonull
(
UDF_INIT
*
,
UDF_ARGS
*
,
char
*
,
unsigned
long
*
,
char
*
,
char
*
);
DllExport
char
*
Json_Object_Nonull
(
UDF_EXEC_ARGS
);
DllExport
void
Json_Object_Nonull_deinit
(
UDF_INIT
*
);
DllExport
my_bool
Json_Array_Grp_init
(
UDF_INIT
*
,
UDF_ARGS
*
,
char
*
);
DllExport
void
Json_Array_Grp_add
(
UDF_INIT
*
,
UDF_ARGS
*
,
char
*
,
char
*
);
DllExport
char
*
Json_Array_Grp
(
UDF_INIT
*
,
UDF_ARGS
*
,
char
*
,
unsigned
long
*
,
char
*
,
char
*
);
DllExport
char
*
Json_Array_Grp
(
UDF_EXEC_ARGS
);
DllExport
void
Json_Array_Grp_clear
(
UDF_INIT
*
,
char
*
,
char
*
);
DllExport
void
Json_Array_Grp_deinit
(
UDF_INIT
*
);
DllExport
my_bool
Json_Object_Grp_init
(
UDF_INIT
*
,
UDF_ARGS
*
,
char
*
);
DllExport
void
Json_Object_Grp_add
(
UDF_INIT
*
,
UDF_ARGS
*
,
char
*
,
char
*
);
DllExport
char
*
Json_Object_Grp
(
UDF_INIT
*
,
UDF_ARGS
*
,
char
*
,
unsigned
long
*
,
char
*
,
char
*
);
DllExport
char
*
Json_Object_Grp
(
UDF_EXEC_ARGS
);
DllExport
void
Json_Object_Grp_clear
(
UDF_INIT
*
,
char
*
,
char
*
);
DllExport
void
Json_Object_Grp_deinit
(
UDF_INIT
*
);
}
// extern "C"
...
...
@@ -404,6 +409,67 @@ void Json_Array_Add_deinit(UDF_INIT* initid)
PlugExit
((
PGLOBAL
)
initid
->
ptr
);
}
// end of Json_Array_Add_deinit
/***********************************************************************/
/* Add values to a Json array. */
/***********************************************************************/
my_bool
Json_Array_Delete_init
(
UDF_INIT
*
initid
,
UDF_ARGS
*
args
,
char
*
message
)
{
unsigned
long
reslen
,
memlen
;
if
(
args
->
arg_count
!=
2
)
{
strcpy
(
message
,
"Json_Value_Delete must have 2 arguments"
);
return
true
;
}
else
if
(
!
IsJson
(
args
,
0
))
{
strcpy
(
message
,
"Json_Value_Delete first argument must be a json item"
);
return
true
;
}
else
CalcLen
(
args
,
false
,
reslen
,
memlen
);
return
JsonInit
(
initid
,
message
,
reslen
,
memlen
);
}
// end of Json_Array_Delete_init
char
*
Json_Array_Delete
(
UDF_INIT
*
initid
,
UDF_ARGS
*
args
,
char
*
result
,
unsigned
long
*
res_length
,
char
*
is_null
,
char
*
error
)
{
char
*
str
;
int
n
;
PJVAL
jvp
;
PJAR
arp
;
PGLOBAL
g
=
(
PGLOBAL
)
initid
->
ptr
;
PlugSubSet
(
g
,
g
->
Sarea
,
g
->
Sarea_Size
);
jvp
=
MakeValue
(
g
,
args
,
0
);
if
(
jvp
->
GetValType
()
!=
TYPE_JAR
)
{
push_warning
(
current_thd
,
Sql_condition
::
WARN_LEVEL_WARN
,
0
,
"First argument is not an array"
);
str
=
args
->
args
[
0
];
}
else
if
(
args
->
arg_type
[
1
]
!=
INT_RESULT
)
{
push_warning
(
current_thd
,
Sql_condition
::
WARN_LEVEL_WARN
,
0
,
"Second argument is not an integer"
);
str
=
args
->
args
[
0
];
}
else
{
n
=
*
(
int
*
)
args
->
args
[
1
];
arp
=
jvp
->
GetArray
();
arp
->
DeleteValue
(
n
-
1
);
arp
->
InitArray
(
g
);
if
(
!
(
str
=
Serialize
(
g
,
arp
,
NULL
,
0
)))
{
str
=
strcpy
(
result
,
g
->
Message
);
push_warning
(
current_thd
,
Sql_condition
::
WARN_LEVEL_WARN
,
0
,
str
);
}
// endif str
}
// endif's
*
res_length
=
strlen
(
str
);
return
str
;
}
// end of Json_Array_Delete
void
Json_Array_Delete_deinit
(
UDF_INIT
*
initid
)
{
PlugExit
((
PGLOBAL
)
initid
->
ptr
);
}
// end of Json_Array_Delete_deinit
/***********************************************************************/
/* Make a Json Oject containing all the parameters. */
/***********************************************************************/
...
...
storage/connect/mysql-test/connect/r/json.result
View file @
b9c89ad0
...
...
@@ -89,8 +89,8 @@ ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher L
UPDATE t1 SET AuthorFN = 'Philippe' WHERE AuthorLN = 'Knab';
SELECT * FROM t1 WHERE ISBN = '9782212090819';
ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year
9782212090819 fr applications
Philipp
e Bernadac Construire une application XML NULL NULL Eyrolles Paris 1999
9782212090819 fr applications
Franois
Knab Construire une application XML NULL NULL Eyrolles Paris 1999
9782212090819 fr applications
Jean-Christoph
e Bernadac Construire une application XML NULL NULL Eyrolles Paris 1999
9782212090819 fr applications
Philippe
Knab Construire une application XML NULL NULL Eyrolles Paris 1999
#
# To add an author a new table must be created
#
...
...
@@ -104,8 +104,8 @@ William J. Pardi
INSERT INTO t2 VALUES('Charles','Dickens');
SELECT * FROM t1;
ISBN Language Subject AuthorFN AuthorLN Title Translation Translator Publisher Location Year
9782212090819 fr applications
Philipp
e Bernadac Construire une application XML NULL NULL Eyrolles Paris 1999
9782212090819 fr applications
Franois
Knab Construire une application XML NULL NULL Eyrolles Paris 1999
9782212090819 fr applications
Jean-Christoph
e Bernadac Construire une application XML NULL NULL Eyrolles Paris 1999
9782212090819 fr applications
Philippe
Knab Construire une application XML NULL NULL Eyrolles Paris 1999
9782840825685 fr applications William J. Pardi XML en Action adapt de l'anglais par James Guerin Microsoft Press Paris 1999
9782840825685 fr applications Charles Dickens XML en Action adapt de l'anglais par James Guerin Microsoft Press Paris 1999
DROP TABLE t1;
...
...
@@ -127,11 +127,11 @@ line
"SUBJECT": "applications",
"AUTHOR": [
{
"FIRSTNAME": "
Philipp
e",
"FIRSTNAME": "
Jean-Christoph
e",
"LASTNAME": "Bernadac"
},
{
"FIRSTNAME": "
Franois"
,
"FIRSTNAME": "
Philippe
",
"LASTNAME": "Knab"
}
],
...
...
storage/connect/mysql-test/connect/r/xml_html.result
0 → 100644
View file @
b9c89ad0
Warnings:
Warning 1105 No file name. Table will use t1.xml
SET NAMES utf8;
#
# Testing HTML like XML file
#
CREATE TABLE beers (
`Name` CHAR(16) FIELD_FORMAT='brandName',
`Origin` CHAR(16) FIELD_FORMAT='origin',
`Description` CHAR(32) FIELD_FORMAT='details')
ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='beers.xml'
TABNAME='table' OPTION_LIST='xmlsup=libxml2,rownode=tr,colnode=td';
SELECT * FROM beers;
Name Origin Description
Huntsman Bath, UK Wonderful hop, light alcohol
Tuborg Danmark In small bottles
DROP TABLE beers;
#
# Testing HTML file
#
CREATE TABLE coffee (
`Name` CHAR(16),
`Cups` INT(8),
`Type` CHAR(16),
`Sugar` CHAR(4))
ENGINE=CONNECT TABLE_TYPE=XML FILE_NAME='coffee.htm'
TABNAME='TABLE' HEADER=1 OPTION_LIST='xmlsup=libxml2,Coltype=HTML';
SELECT * FROM coffee;
Name Cups Type Sugar
T. Sexton 10 Espresso No
J. Dinnen 5 Decaf Yes
DROP TABLE coffee;
storage/connect/mysql-test/connect/std_data/beers.xml
0 → 100644
View file @
b9c89ad0
<?xml version="1.0"?>
<Beers>
<table>
<th><td>
Name
</td><td>
Origin
</td><td>
Description
</td></th>
<tr>
<td><brandName>
Huntsman
</brandName></td>
<td><origin>
Bath, UK
</origin></td>
<td><details>
Wonderful hop, light alcohol
</details></td>
</tr>
<tr>
<td><brandName>
Tuborg
</brandName></td>
<td><origin>
Danmark
</origin></td>
<td><details>
In small bottles
</details></td>
</tr>
</table>
</Beers>
storage/connect/mysql-test/connect/std_data/coffee.htm
0 → 100644
View file @
b9c89ad0
<TABLE
summary=
"This table charts the number of cups of coffe
consumed by each senator, the type of coffee (decaf
or regular), and whether taken with sugar."
>
<CAPTION>
Cups of coffee consumed by each senator
</CAPTION>
<TR>
<TH>
Name
</TH>
<TH>
Cups
</TH>
<TH>
Type of Coffee
</TH>
<TH>
Sugar?
</TH>
</TR>
<TR>
<TD>
T. Sexton
</TD>
<TD>
10
</TD>
<TD>
Espresso
</TD>
<TD>
No
</TD>
</TR>
<TR>
<TD>
J. Dinnen
</TD>
<TD>
5
</TD>
<TD>
Decaf
</TD>
<TD>
Yes
</TD>
</TR>
</TABLE>
storage/connect/mysql-test/connect/t/json_udf.inc
View file @
b9c89ad0
--
disable_query_log
#
# Check if server has support for loading plugins
#
if
(
`SELECT @@have_dynamic_loading != 'YES'`
)
{
--
skip
UDF
requires
dynamic
loading
}
if
(
!
$HA_CONNECT_SO
)
{
--
skip
Needs
a
dynamically
built
ha_connect
.
so
}
let
$is_win
=
`select convert(@@version_compile_os using latin1) IN ("Win32","Win64","Windows")`
;
if
(
$is_win
)
{
--
eval
CREATE
FUNCTION
Json_Array
RETURNS
STRING
SONAME
'ha_connect.dll'
;
--
eval
CREATE
FUNCTION
Json_Array_Add
RETURNS
STRING
SONAME
'ha_connect.dll'
;
--
eval
CREATE
FUNCTION
Json_Object
RETURNS
STRING
SONAME
'ha_connect.dll'
;
--
eval
CREATE
FUNCTION
Json_Object_Nonull
RETURNS
STRING
SONAME
'ha_connect.dll'
;
--
eval
CREATE
FUNCTION
Json_Value
returns
STRING
SONAME
'ha_connect.dll'
;
--
eval
CREATE
AGGREGATE
FUNCTION
Json_Array_Grp
RETURNS
STRING
SONAME
'ha_connect.dll'
;
--
eval
CREATE
AGGREGATE
FUNCTION
Json_Object_Grp
RETURNS
STRING
SONAME
'ha_connect.dll'
;
}
if
(
!
$is_win
)
{
--
eval
CREATE
FUNCTION
Json_Array
RETURNS
STRING
SONAME
'ha_connect.so'
;
--
eval
CREATE
FUNCTION
Json_Array_Add
RETURNS
STRING
SONAME
'ha_connect.so'
;
--
eval
CREATE
FUNCTION
Json_Object
RETURNS
STRING
SONAME
'ha_connect.so'
;
--
eval
CREATE
FUNCTION
Json_Object_Nonull
RETURNS
STRING
SONAME
'ha_connect.so'
;
--
eval
CREATE
FUNCTION
Json_Value
returns
STRING
SONAME
'ha_connect.so'
;
--
eval
CREATE
AGGREGATE
FUNCTION
Json_Array_Grp
RETURNS
STRING
SONAME
'ha_connect.so'
;
--
eval
CREATE
AGGREGATE
FUNCTION
Json_Object_Grp
RETURNS
STRING
SONAME
'ha_connect.so'
;
}
--
enable_query_log
--
disable_query_log
#
# Check if server has support for loading plugins
#
if
(
`SELECT @@have_dynamic_loading != 'YES'`
)
{
--
skip
UDF
requires
dynamic
loading
}
if
(
!
$HA_CONNECT_SO
)
{
--
skip
Needs
a
dynamically
built
ha_connect
.
so
}
let
$is_win
=
`select convert(@@version_compile_os using latin1) IN ("Win32","Win64","Windows")`
;
if
(
$is_win
)
{
--
eval
CREATE
FUNCTION
Json_Array
RETURNS
STRING
SONAME
'ha_connect.dll'
;
--
eval
CREATE
FUNCTION
Json_Array_Add
RETURNS
STRING
SONAME
'ha_connect.dll'
;
--
eval
CREATE
FUNCTION
Json_Object
RETURNS
STRING
SONAME
'ha_connect.dll'
;
--
eval
CREATE
FUNCTION
Json_Object_Nonull
RETURNS
STRING
SONAME
'ha_connect.dll'
;
--
eval
CREATE
FUNCTION
Json_Value
returns
STRING
SONAME
'ha_connect.dll'
;
--
eval
CREATE
AGGREGATE
FUNCTION
Json_Array_Grp
RETURNS
STRING
SONAME
'ha_connect.dll'
;
--
eval
CREATE
AGGREGATE
FUNCTION
Json_Object_Grp
RETURNS
STRING
SONAME
'ha_connect.dll'
;
}
if
(
!
$is_win
)
{
--
eval
CREATE
FUNCTION
Json_Array
RETURNS
STRING
SONAME
'ha_connect.so'
;
--
eval
CREATE
FUNCTION
Json_Array_Add
RETURNS
STRING
SONAME
'ha_connect.so'
;
--
eval
CREATE
FUNCTION
Json_Object
RETURNS
STRING
SONAME
'ha_connect.so'
;
--
eval
CREATE
FUNCTION
Json_Object_Nonull
RETURNS
STRING
SONAME
'ha_connect.so'
;
--
eval
CREATE
FUNCTION
Json_Value
returns
STRING
SONAME
'ha_connect.so'
;
--
eval
CREATE
AGGREGATE
FUNCTION
Json_Array_Grp
RETURNS
STRING
SONAME
'ha_connect.so'
;
--
eval
CREATE
AGGREGATE
FUNCTION
Json_Object_Grp
RETURNS
STRING
SONAME
'ha_connect.so'
;
}
--
enable_query_log
storage/connect/mysql-test/connect/t/xml_html.test
0 → 100644
View file @
b9c89ad0
--
source
have_libxml2
.
inc
let
$MYSQLD_DATADIR
=
`select @@datadir`
;
SET
NAMES
utf8
;
--
copy_file
$MTR_SUITE_DIR
/
std_data
/
beers
.
xml
$MYSQLD_DATADIR
/
test
/
beers
.
xml
--
copy_file
$MTR_SUITE_DIR
/
std_data
/
coffee
.
htm
$MYSQLD_DATADIR
/
test
/
coffee
.
htm
--
echo
#
--
echo
# Testing HTML like XML file
--
echo
#
CREATE
TABLE
beers
(
`Name`
CHAR
(
16
)
FIELD_FORMAT
=
'brandName'
,
`Origin`
CHAR
(
16
)
FIELD_FORMAT
=
'origin'
,
`Description`
CHAR
(
32
)
FIELD_FORMAT
=
'details'
)
ENGINE
=
CONNECT
TABLE_TYPE
=
XML
FILE_NAME
=
'beers.xml'
TABNAME
=
'table'
OPTION_LIST
=
'xmlsup=libxml2,rownode=tr,colnode=td'
;
SELECT
*
FROM
beers
;
DROP
TABLE
beers
;
--
echo
#
--
echo
# Testing HTML file
--
echo
#
CREATE
TABLE
coffee
(
`Name`
CHAR
(
16
),
`Cups`
INT
(
8
),
`Type`
CHAR
(
16
),
`Sugar`
CHAR
(
4
))
ENGINE
=
CONNECT
TABLE_TYPE
=
XML
FILE_NAME
=
'coffee.htm'
TABNAME
=
'TABLE'
HEADER
=
1
OPTION_LIST
=
'xmlsup=libxml2,Coltype=HTML'
;
SELECT
*
FROM
coffee
;
DROP
TABLE
coffee
;
#
# Clean up
#
--
remove_file
$MYSQLD_DATADIR
/
test
/
beers
.
xml
--
remove_file
$MYSQLD_DATADIR
/
test
/
coffee
.
htm
storage/connect/tabjson.cpp
View file @
b9c89ad0
...
...
@@ -968,6 +968,20 @@ bool JSONCOL::ParseJpath(PGLOBAL g)
else
if
(
!
Jpath
)
Jpath
=
Name
;
if
(
To_Tdb
->
GetOrig
())
{
// This is an updated column, get nodes from origin
for
(
PJCOL
colp
=
(
PJCOL
)
Tjp
->
GetColumns
();
colp
;
colp
=
(
PJCOL
)
colp
->
GetNext
())
if
(
!
stricmp
(
Name
,
colp
->
GetName
()))
{
Nod
=
colp
->
Nod
;
Nodes
=
colp
->
Nodes
;
goto
fin
;
}
// endif Name
sprintf
(
g
->
Message
,
"Cannot parse updated column %s"
,
Name
);
return
true
;
}
// endif To_Orig
pbuf
=
PlugDup
(
g
,
Jpath
);
// The Jpath must be analyzed
...
...
@@ -998,6 +1012,7 @@ bool JSONCOL::ParseJpath(PGLOBAL g)
}
// endfor i, p
fin:
MulVal
=
AllocateValue
(
g
,
Value
);
Parsed
=
true
;
return
false
;
...
...
@@ -1147,7 +1162,7 @@ PVAL JSONCOL::ExpandArray(PGLOBAL g, PJAR arp, int n)
ars
=
MY_MIN
(
Tjp
->
Limit
,
arp
->
size
());
if
(
!
(
jvp
=
arp
->
GetValue
(
Nodes
[
n
].
Nx
)))
{
if
(
!
(
jvp
=
arp
->
GetValue
(
(
Nodes
[
n
].
Rx
=
Nodes
[
n
].
Nx
)
)))
{
strcpy
(
g
->
Message
,
"Logical error expanding array"
);
longjmp
(
g
->
jumper
[
g
->
jump_level
],
666
);
}
// endif jvp
...
...
@@ -1278,7 +1293,7 @@ PJSON JSONCOL::GetRow(PGLOBAL g)
if
(
Nodes
[
i
].
Rank
)
val
=
arp
->
GetValue
(
Nodes
[
i
].
Rank
-
1
);
else
val
=
arp
->
GetValue
(
Nodes
[
i
].
N
x
);
val
=
arp
->
GetValue
(
Nodes
[
i
].
R
x
);
}
else
val
=
NULL
;
...
...
@@ -1726,7 +1741,7 @@ bool TDBJSON::OpenDB(PGLOBAL g)
/***********************************************************************/
int
TDBJSON
::
ReadDB
(
PGLOBAL
g
)
{
int
rc
;
int
rc
;
N
++
;
...
...
storage/connect/tabjson.h
View file @
b9c89ad0
...
...
@@ -25,7 +25,8 @@ typedef struct _jnode {
PVAL
CncVal
;
// To cont value used for OP_CNC
PVAL
Valp
;
// The internal array VALUE
int
Rank
;
// The rank in array
int
Nx
;
// Same row number
int
Rx
;
// Read row number
int
Nx
;
// Next to read row number
}
JNODE
,
*
PJNODE
;
/***********************************************************************/
...
...
storage/connect/tabmul.cpp
View file @
b9c89ad0
...
...
@@ -171,8 +171,10 @@ bool TDBMUL::InitFileNames(PGLOBAL g)
}
// endif hSearch
while
(
n
<
PFNZ
)
{
strcat
(
strcat
(
strcpy
(
filename
,
drive
),
direc
),
FileData
.
cFileName
);
pfn
[
n
++
]
=
PlugDup
(
g
,
filename
);
if
(
!
(
FileData
.
dwFileAttributes
&
FILE_ATTRIBUTE_DIRECTORY
))
{
strcat
(
strcat
(
strcpy
(
filename
,
drive
),
direc
),
FileData
.
cFileName
);
pfn
[
n
++
]
=
PlugDup
(
g
,
filename
);
}
// endif dwFileAttributes
if
(
!
FindNextFile
(
hSearch
,
&
FileData
))
{
rc
=
GetLastError
();
...
...
storage/connect/tabmysql.cpp
View file @
b9c89ad0
...
...
@@ -1060,9 +1060,16 @@ bool TDBMYSQL::ReadKey(PGLOBAL g, OPVAL op, const void *key, int len)
int
oldlen
=
Query
->
GetLength
();
if
(
!
key
||
op
==
OP_NEXT
||
Mode
==
MODE_UPDATE
||
Mode
==
MODE_DELETE
)
Mode
==
MODE_UPDATE
||
Mode
==
MODE_DELETE
)
{
if
(
!
key
&&
Mode
==
MODE_READX
)
{
// This is a false indexed read
m_Rc
=
Myc
.
ExecSQL
(
g
,
Query
->
GetStr
());
Mode
=
MODE_READ
;
return
(
m_Rc
==
RC_FX
)
?
true
:
false
;
}
// endif key
return
false
;
else
if
(
op
==
OP_FIRST
)
{
}
else
if
(
op
==
OP_FIRST
)
{
if
(
To_CondFil
)
{
oom
=
Query
->
Append
(
" WHERE "
);
...
...
storage/connect/tabtbl.cpp
View file @
b9c89ad0
...
...
@@ -5,7 +5,7 @@
/* */
/* COPYRIGHT: */
/* ---------- */
/* (C) Copyright to PlugDB Software Development 2008-201
4
*/
/* (C) Copyright to PlugDB Software Development 2008-201
5
*/
/* Author: Olivier BERTRAND */
/* */
/* WHAT THIS PROGRAM DOES: */
...
...
storage/connect/tabutil.cpp
View file @
b9c89ad0
...
...
@@ -52,7 +52,6 @@
#include "tabutil.h"
#include "ha_connect.h"
//extern "C" int zconv;
int
GetConvSize
(
void
);
/************************************************************************/
...
...
@@ -72,11 +71,8 @@ TABLE_SHARE *GetTableShare(PGLOBAL g, THD *thd, const char *db,
{
char
key
[
256
];
uint
k
;
//TABLE_LIST table_list;
TABLE_SHARE
*
s
;
//table_list.init_one_table(db, strlen(db), name, strlen(name),
// NULL, TL_IGNORE);
k
=
sprintf
(
key
,
"%s"
,
db
)
+
1
;
k
+=
sprintf
(
key
+
k
,
"%s"
,
name
);
key
[
++
k
]
=
0
;
...
...
@@ -86,9 +82,6 @@ TABLE_SHARE *GetTableShare(PGLOBAL g, THD *thd, const char *db,
return
NULL
;
}
// endif s
// 1 2 4 8
//flags = GTS_TABLE | GTS_VIEW | GTS_NOLOCK | GTS_FORCE_DISCOVERY;
if
(
!
open_table_def
(
thd
,
s
,
GTS_TABLE
|
GTS_VIEW
))
{
if
(
!
s
->
is_view
)
{
if
(
stricmp
(
plugin_name
(
s
->
db_plugin
)
->
str
,
"connect"
))
...
...
storage/connect/tabxml.cpp
View file @
b9c89ad0
...
...
@@ -1505,8 +1505,9 @@ bool XMLCOL::ParseXpath(PGLOBAL g, bool mode)
}
else
if
(
Type
==
2
)
{
// HTML like table, columns are retrieved by position
new
(
this
)
XPOSCOL
(
Value
);
// Change the class of this column
Tdbp
->
Hasnod
=
true
;
return
false
;
Inod
=
-
1
;
// Tdbp->Hasnod = true;
// return false;
}
else
if
(
Type
==
0
&&
!
mode
)
{
strcat
(
strcat
(
pbuf
,
"@"
),
Name
);
}
else
{
// Type == 1
...
...
storage/connect/value.cpp
View file @
b9c89ad0
/************* Value C++ Functions Source Code File (.CPP) *************/
/* Name: VALUE.CPP Version 2.5 */
/* */
/* (C) Copyright to the author Olivier BERTRAND 2001-201
4
*/
/* (C) Copyright to the author Olivier BERTRAND 2001-201
5
*/
/* */
/* This file contains the VALUE and derived classes family functions. */
/* These classes contain values of different types. They are used so */
...
...
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