1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-08 11:22:35 +03:00

Merge branch '10.2' into 10.3

This commit is contained in:
Oleksandr Byelkin
2021-07-29 13:51:02 +02:00
140 changed files with 2655 additions and 1338 deletions

View File

@@ -2,13 +2,13 @@ THE MAIN PCRE LIBRARY
---------------------
Written by: Philip Hazel
Email local part: ph10
Email domain: cam.ac.uk
Email local part: Philip.Hazel
Email domain: gmail.com
University of Cambridge Computing Service,
Cambridge, England.
Copyright (c) 1997-2020 University of Cambridge
Copyright (c) 1997-2021 University of Cambridge
All rights reserved
@@ -19,7 +19,7 @@ Written by: Zoltan Herczeg
Email local part: hzmester
Emain domain: freemail.hu
Copyright(c) 2010-2020 Zoltan Herczeg
Copyright(c) 2010-2021 Zoltan Herczeg
All rights reserved.
@@ -30,7 +30,7 @@ Written by: Zoltan Herczeg
Email local part: hzmester
Emain domain: freemail.hu
Copyright(c) 2009-2020 Zoltan Herczeg
Copyright(c) 2009-2021 Zoltan Herczeg
All rights reserved.

View File

@@ -67,10 +67,17 @@
# 2013-11-05 PH added support for PARENS_NEST_LIMIT
# 2016-03-01 PH applied Chris Wilson's patch for MSVC static build
# 2016-06-24 PH applied Chris Wilson's revised patch (adds a separate option)
# 2021-06-14 PH changed CMAKE_MODULE_PATH definition to add, not replace
# 2021-06-14 PH applied Wolfgang Stöggl's patch for generating pcre-config and
# libpcre*.pc files (Bugzilla #2583)
PROJECT(PCRE C CXX)
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # for FindReadline.cmake
# For FindReadline.cmake. This was changed to allow setting CMAKE_MODULE_PATH
# on the command line.
# SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) # for FindReadline.cmake
LIST(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
# Enable Unicode properties
OPTION(PCRE_SUPPORT_UNICODE_PROPERTIES "Unicode properties" ON)
@@ -83,6 +90,7 @@ INCLUDE(CheckIncludeFile)
INCLUDE(CheckIncludeFileCXX)
INCLUDE(CheckFunctionExists)
INCLUDE(CheckTypeSize)
INCLUDE(GNUInstallDirs) # for CMAKE_INSTALL_LIBDIR
CHECK_INCLUDE_FILE(dirent.h HAVE_DIRENT_H)
CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
@@ -255,7 +263,7 @@ foreach(configure_line ${configure_lines})
foreach(_substitution_variable ${SEARCHED_VARIABLES})
string(TOUPPER ${_substitution_variable} _substitution_variable_upper)
if (NOT ${_substitution_variable_upper})
string(REGEX MATCH "m4_define\\(${_substitution_variable}, \\[(.*)\\]" MACTHED_STRING ${configure_line})
string(REGEX MATCH "m4_define\\(${_substitution_variable}, \\[(.*)\\]" MATCHED_STRING ${configure_line})
if (CMAKE_MATCH_1)
set(${_substitution_variable_upper} ${CMAKE_MATCH_1})
endif()
@@ -442,7 +450,6 @@ MARK_AS_ADVANCED(PCRE_POSIX_MALLOC_THRESHOLD)
MARK_AS_ADVANCED(PCRE_SUPPORT_BSR_ANYCRLF)
MARK_AS_ADVANCED(PCRE_SUPPORT_UNICODE_PROPERTIES)
IF(PCRE_SHOW_REPORT)
STRING(TOUPPER "${CMAKE_BUILD_TYPE}" buildtype)
IF (CMAKE_C_FLAGS)
@@ -453,7 +460,7 @@ IF(PCRE_SHOW_REPORT)
ENDIF(CMAKE_CXX_FLAGS)
MESSAGE(STATUS "")
MESSAGE(STATUS "")
MESSAGE(STATUS "PCRE configuration summary:")
MESSAGE(STATUS "PCRE-${PCRE_MAJOR}.${PCRE_MINOR} configuration summary:")
MESSAGE(STATUS "")
# MESSAGE(STATUS " Install prefix .................. : ${CMAKE_INSTALL_PREFIX}")
MESSAGE(STATUS " C compiler ...................... : ${CMAKE_C_COMPILER}")

View File

@@ -1,8 +1,25 @@
ChangeLog for PCRE
------------------
Note that the PCRE 8.xx series (PCRE1) is now in a bugfix-only state. All
development is happening in the PCRE2 10.xx series.
Note that the PCRE 8.xx series (PCRE1) is now at end of life. All development
is happening in the PCRE2 10.xx series.
Version 8.45 15-June-2021
-------------------------
This is the final release of PCRE1. A few minor tidies are included.
1. CMakeLists.txt has two user-supplied patches applied, one to allow for the
setting of MODULE_PATH, and the other to support the generation of pcre-config
file and libpcre*.pc files.
2. There was a memory leak if a compile error occurred when there were more
than 20 named groups (Bugzilla #2613).
3. Fixed some typos in code and documentation.
4. Fixed a small (*MARK) bug in the interpreter (Bugzilla #2771).
Version 8.44 12 February-2020

View File

@@ -19,13 +19,13 @@ THE BASIC LIBRARY FUNCTIONS
---------------------------
Written by: Philip Hazel
Email local part: ph10
Email domain: cam.ac.uk
Email local part: Philip.Hazel
Email domain: gmail.com
University of Cambridge Computing Service,
Cambridge, England.
Copyright (c) 1997-2020 University of Cambridge
Copyright (c) 1997-2021 University of Cambridge
All rights reserved.
@@ -36,7 +36,7 @@ Written by: Zoltan Herczeg
Email local part: hzmester
Email domain: freemail.hu
Copyright(c) 2010-2020 Zoltan Herczeg
Copyright(c) 2010-2021 Zoltan Herczeg
All rights reserved.
@@ -47,7 +47,7 @@ Written by: Zoltan Herczeg
Email local part: hzmester
Email domain: freemail.hu
Copyright(c) 2009-2020 Zoltan Herczeg
Copyright(c) 2009-2021 Zoltan Herczeg
All rights reserved.

View File

@@ -1,8 +1,14 @@
News about PCRE releases
------------------------
Note that this library (now called PCRE1) is now being maintained for bug fixes
only. New projects are advised to use the new PCRE2 libraries.
Note that this library (now called PCRE1) is no longer being maintained. New
projects are advised to use the PCRE2 libraries.
Release 8.45 15-June-2021
-----------------------------
This is the final PCRE1 release. A very few small issues have been fixed.
Release 8.44 12-February-2020

View File

@@ -5,8 +5,8 @@ NOTE: This document relates to PCRE releases that use the original API, with
library names libpcre, libpcre16, and libpcre32. January 2015 saw the first
release of a new API, known as PCRE2, with release numbers starting at 10.00
and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old libraries
(now called PCRE1) are still being maintained for bug fixes, but there will be
no new development. New projects are advised to use the new PCRE2 libraries.
(now called PCRE1) are now at end of life, and 8.45 is the final release. New
projects are advised to use the new PCRE2 libraries.
This document contains the following sections:
@@ -768,6 +768,6 @@ Everything, source and executable, is in EBCDIC and native z/OS file formats.
However, this software is not maintained and will not be upgraded. If you are
new to PCRE you should be looking at PCRE2 (version 10.30 or later).
===============================
Last Updated: 13 September 2017
===============================
==========================
Last Updated: 15 June 2021
==========================

View File

@@ -5,9 +5,8 @@ NOTE: This set of files relates to PCRE releases that use the original API,
with library names libpcre, libpcre16, and libpcre32. January 2015 saw the
first release of a new API, known as PCRE2, with release numbers starting at
10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old
libraries (now called PCRE1) are still being maintained for bug fixes, but
there will be no new development. New projects are advised to use the new PCRE2
libraries.
libraries (now called PCRE1) are now at end of life, and 8.45 is the final
release. New projects are advised to use the new PCRE2 libraries.
The latest release of PCRE1 is always available in three alternative formats
@@ -998,6 +997,6 @@ pcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx.
RunTest.bat a script for running tests under Windows
Philip Hazel
Email local part: ph10
Email domain: cam.ac.uk
Last updated: 12 February 2020
Email local part: Philip.Hazel
Email domain: gmail.com
Last updated: 15 June 2021

View File

@@ -9,17 +9,17 @@ dnl The PCRE_PRERELEASE feature is for identifying release candidates. It might
dnl be defined as -RC2, for example. For real releases, it should be empty.
m4_define(pcre_major, [8])
m4_define(pcre_minor, [44])
m4_define(pcre_minor, [45])
m4_define(pcre_prerelease, [])
m4_define(pcre_date, [2020-02-12])
m4_define(pcre_date, [2021-06-15])
# NOTE: The CMakeLists.txt file searches for the above variables in the first
# 50 lines of this file. Please update that if the variables above are moved.
# Libtool shared library interface versions (current:revision:age)
m4_define(libpcre_version, [3:12:2])
m4_define(libpcre16_version, [2:12:2])
m4_define(libpcre32_version, [0:12:0])
m4_define(libpcre_version, [3:13:2])
m4_define(libpcre16_version, [2:13:2])
m4_define(libpcre32_version, [0:13:0])
m4_define(libpcreposix_version, [0:7:0])
m4_define(libpcrecpp_version, [0:2:0])

View File

@@ -5,8 +5,8 @@ NOTE: This document relates to PCRE releases that use the original API, with
library names libpcre, libpcre16, and libpcre32. January 2015 saw the first
release of a new API, known as PCRE2, with release numbers starting at 10.00
and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old libraries
(now called PCRE1) are still being maintained for bug fixes, but there will be
no new development. New projects are advised to use the new PCRE2 libraries.
(now called PCRE1) are now at end of life, and 8.45 is the final release. New
projects are advised to use the new PCRE2 libraries.
This document contains the following sections:
@@ -768,6 +768,6 @@ Everything, source and executable, is in EBCDIC and native z/OS file formats.
However, this software is not maintained and will not be upgraded. If you are
new to PCRE you should be looking at PCRE2 (version 10.30 or later).
===============================
Last Updated: 13 September 2017
===============================
==========================
Last Updated: 15 June 2021
==========================

View File

@@ -5,9 +5,8 @@ NOTE: This set of files relates to PCRE releases that use the original API,
with library names libpcre, libpcre16, and libpcre32. January 2015 saw the
first release of a new API, known as PCRE2, with release numbers starting at
10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old
libraries (now called PCRE1) are still being maintained for bug fixes, but
there will be no new development. New projects are advised to use the new PCRE2
libraries.
libraries (now called PCRE1) are now at end of life, and 8.45 is the final
release. New projects are advised to use the new PCRE2 libraries.
The latest release of PCRE1 is always available in three alternative formats
@@ -998,6 +997,6 @@ pcre_xxx, one with the name pcre16_xx, and a third with the name pcre32_xxx.
RunTest.bat a script for running tests under Windows
Philip Hazel
Email local part: ph10
Email domain: cam.ac.uk
Last updated: 12 February 2020
Email local part: Philip.Hazel
Email domain: gmail.com
Last updated: 15 June 2021

View File

@@ -22,13 +22,12 @@ man page, in case the conversion went wrong.
</ul>
<br><a name="SEC1" href="#TOC1">PLEASE TAKE NOTE</a><br>
<P>
This document relates to PCRE releases that use the original API,
with library names libpcre, libpcre16, and libpcre32. January 2015 saw the
first release of a new API, known as PCRE2, with release numbers starting at
10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old
libraries (now called PCRE1) are still being maintained for bug fixes, but
there will be no new development. New projects are advised to use the new PCRE2
libraries.
This document relates to PCRE releases that use the original API, with library
names libpcre, libpcre16, and libpcre32. January 2015 saw the first release of
a new API, known as PCRE2, with release numbers starting at 10.00 and library
names libpcre2-8, libpcre2-16, and libpcre2-32. The old libraries (now called
PCRE1) are now at end of life, and 8.45 is the final release. New projects are
advised to use the new PCRE2 libraries.
</P>
<br><a name="SEC2" href="#TOC1">INTRODUCTION</a><br>
<P>
@@ -215,9 +214,9 @@ two digits 10, at the domain cam.ac.uk.
</P>
<br><a name="SEC6" href="#TOC1">REVISION</a><br>
<P>
Last updated: 10 February 2015
Last updated: 14 June 2021
<br>
Copyright &copy; 1997-2015 University of Cambridge.
Copyright &copy; 1997-2021 University of Cambridge.
<br>
<p>
Return to the <a href="index.html">PCRE index page</a>.

View File

@@ -1718,7 +1718,7 @@ very long time, and so the <i>match_limit</i> value is also used in this case
<P>
The default value for the limit can be set when PCRE is built; the default
default is 10 million, which handles all but the most extreme cases. You can
override the default by suppling <b>pcre_exec()</b> with a <b>pcre_extra</b>
override the default by supplying <b>pcre_exec()</b> with a <b>pcre_extra</b>
block in which <i>match_limit</i> is set, and PCRE_EXTRA_MATCH_LIMIT is set in
the <i>flags</i> field. If the limit is exceeded, <b>pcre_exec()</b> returns
PCRE_ERROR_MATCHLIMIT.
@@ -1749,7 +1749,7 @@ and is ignored, when matching is done using JIT compiled code.
<P>
The default value for <i>match_limit_recursion</i> can be set when PCRE is
built; the default default is the same value as the default for
<i>match_limit</i>. You can override the default by suppling <b>pcre_exec()</b>
<i>match_limit</i>. You can override the default by supplying <b>pcre_exec()</b>
with a <b>pcre_extra</b> block in which <i>match_limit_recursion</i> is set, and
PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the <i>flags</i> field. If the limit
is exceeded, <b>pcre_exec()</b> returns PCRE_ERROR_RECURSIONLIMIT.
@@ -2063,10 +2063,10 @@ lookbehind. For example, consider the pattern
</pre>
which finds occurrences of "iss" in the middle of words. (\B matches only if
the current position in the subject is not a word boundary.) When applied to
the string "Mississipi" the first call to <b>pcre_exec()</b> finds the first
the string "Mississippi" the first call to <b>pcre_exec()</b> finds the first
occurrence. If <b>pcre_exec()</b> is called again with just the remainder of the
subject, namely "issipi", it does not match, because \B is always false at the
start of the subject, which is deemed to be a word boundary. However, if
subject, namely "issippi", it does not match, because \B is always false at
the start of the subject, which is deemed to be a word boundary. However, if
<b>pcre_exec()</b> is passed the entire string again, but with <i>startoffset</i>
set to 4, it finds the second occurrence of "iss" because it is able to look
behind the starting point to discover that it is preceded by a letter.

View File

@@ -655,7 +655,7 @@ recognized.
<P>
It is possible to restrict \R to match only CR, LF, or CRLF (instead of the
complete set of Unicode line endings) by setting the option PCRE_BSR_ANYCRLF
either at compile time or when the pattern is matched. (BSR is an abbrevation
either at compile time or when the pattern is matched. (BSR is an abbreviation
for "backslash R".) This can be made the default when PCRE is built; if this is
the case, the other behaviour can be requested via the PCRE_BSR_UNICODE option.
It is also possible to specify these settings by starting a pattern string with
@@ -972,7 +972,7 @@ additional characters according to the following rules for ending a cluster:
3. Do not break Hangul (a Korean script) syllable sequences. Hangul characters
are of five types: L, V, T, LV, and LVT. An L character may be followed by an
L, V, LV, or LVT character; an LV or V character may be followed by a V or T
character; an LVT or T character may be follwed only by a T character.
character; an LVT or T character may be followed only by a T character.
</P>
<P>
4. Do not end before extending characters or spacing marks. Characters with
@@ -3080,7 +3080,7 @@ successful match. Consider:
</pre>
If the subject is "aaaac...", after the first match attempt fails (starting at
the first character in the string), the starting point skips on to start the
next attempt at "c". Note that a possessive quantifer does not have the same
next attempt at "c". Note that a possessive quantifier does not have the same
effect as this example; although it would suppress backtracking during the
first match attempt, the second attempt would start at the second character
instead of skipping on to "c".

View File

@@ -157,7 +157,7 @@ is changed to use Unicode properties and they match many more characters.
Xan Alphanumeric: union of properties L and N
Xps POSIX space: property Z or tab, NL, VT, FF, CR
Xsp Perl space: property Z or tab, NL, VT, FF, CR
Xuc Univerally-named character: one that can be
Xuc Universally-named character: one that can be
represented by a Universal Character Name
Xwd Perl word: property Xan or underscore
</pre>

View File

@@ -1,16 +1,15 @@
.TH PCRE 3 "10 February 2015" "PCRE 8.37"
.TH PCRE 3 "14 June 2021" "PCRE 8.45"
.SH NAME
PCRE - Perl-compatible regular expressions (original API)
.SH "PLEASE TAKE NOTE"
.rs
.sp
This document relates to PCRE releases that use the original API,
with library names libpcre, libpcre16, and libpcre32. January 2015 saw the
first release of a new API, known as PCRE2, with release numbers starting at
10.00 and library names libpcre2-8, libpcre2-16, and libpcre2-32. The old
libraries (now called PCRE1) are still being maintained for bug fixes, but
there will be no new development. New projects are advised to use the new PCRE2
libraries.
This document relates to PCRE releases that use the original API, with library
names libpcre, libpcre16, and libpcre32. January 2015 saw the first release of
a new API, known as PCRE2, with release numbers starting at 10.00 and library
names libpcre2-8, libpcre2-16, and libpcre2-32. The old libraries (now called
PCRE1) are now at end of life, and 8.45 is the final release. New projects are
advised to use the new PCRE2 libraries.
.
.
.SH INTRODUCTION
@@ -225,6 +224,6 @@ two digits 10, at the domain cam.ac.uk.
.rs
.sp
.nf
Last updated: 10 February 2015
Copyright (c) 1997-2015 University of Cambridge.
Last updated: 14 June 2021
Copyright (c) 1997-2021 University of Cambridge.
.fi

View File

@@ -21,9 +21,9 @@ PLEASE TAKE NOTE
library names libpcre, libpcre16, and libpcre32. January 2015 saw the
first release of a new API, known as PCRE2, with release numbers start-
ing at 10.00 and library names libpcre2-8, libpcre2-16, and
libpcre2-32. The old libraries (now called PCRE1) are still being main-
tained for bug fixes, but there will be no new development. New
projects are advised to use the new PCRE2 libraries.
libpcre2-32. The old libraries (now called PCRE1) are now at end of
life, and 8.45 is the final release. New projects are advised to use
the new PCRE2 libraries.
INTRODUCTION
@@ -190,8 +190,8 @@ AUTHOR
REVISION
Last updated: 10 February 2015
Copyright (c) 1997-2015 University of Cambridge.
Last updated: 14 June 2021
Copyright (c) 1997-2021 University of Cambridge.
------------------------------------------------------------------------------
@@ -3155,7 +3155,7 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION
The default value for the limit can be set when PCRE is built; the de-
fault default is 10 million, which handles all but the most extreme
cases. You can override the default by suppling pcre_exec() with a
cases. You can override the default by supplying pcre_exec() with a
pcre_extra block in which match_limit is set, and PCRE_EX-
TRA_MATCH_LIMIT is set in the flags field. If the limit is exceeded,
pcre_exec() returns PCRE_ERROR_MATCHLIMIT.
@@ -3183,7 +3183,7 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION
The default value for match_limit_recursion can be set when PCRE is
built; the default default is the same value as the default for
match_limit. You can override the default by suppling pcre_exec() with
match_limit. You can override the default by supplying pcre_exec() with
a pcre_extra block in which match_limit_recursion is set, and PCRE_EX-
TRA_MATCH_LIMIT_RECURSION is set in the flags field. If the limit is
exceeded, pcre_exec() returns PCRE_ERROR_RECURSIONLIMIT.
@@ -3475,9 +3475,9 @@ MATCHING A PATTERN: THE TRADITIONAL FUNCTION
which finds occurrences of "iss" in the middle of words. (\B matches
only if the current position in the subject is not a word boundary.)
When applied to the string "Mississipi" the first call to pcre_exec()
When applied to the string "Mississippi" the first call to pcre_exec()
finds the first occurrence. If pcre_exec() is called again with just
the remainder of the subject, namely "issipi", it does not match, be-
the remainder of the subject, namely "issippi", it does not match, be-
cause \B is always false at the start of the subject, which is deemed
to be a word boundary. However, if pcre_exec() is passed the entire
string again, but with startoffset set to 4, it finds the second occur-
@@ -5292,11 +5292,11 @@ BACKSLASH
It is possible to restrict \R to match only CR, LF, or CRLF (instead of
the complete set of Unicode line endings) by setting the option
PCRE_BSR_ANYCRLF either at compile time or when the pattern is matched.
(BSR is an abbrevation for "backslash R".) This can be made the default
when PCRE is built; if this is the case, the other behaviour can be re-
quested via the PCRE_BSR_UNICODE option. It is also possible to spec-
ify these settings by starting a pattern string with one of the follow-
ing sequences:
(BSR is an abbreviation for "backslash R".) This can be made the de-
fault when PCRE is built; if this is the case, the other behaviour can
be requested via the PCRE_BSR_UNICODE option. It is also possible to
specify these settings by starting a pattern string with one of the
following sequences:
(*BSR_ANYCRLF) CR, LF, or CRLF only
(*BSR_UNICODE) any Unicode newline sequence
@@ -5488,8 +5488,8 @@ BACKSLASH
3. Do not break Hangul (a Korean script) syllable sequences. Hangul
characters are of five types: L, V, T, LV, and LVT. An L character may
be followed by an L, V, LV, or LVT character; an LV or V character may
be followed by a V or T character; an LVT or T character may be follwed
only by a T character.
be followed by a V or T character; an LVT or T character may be fol-
lowed only by a T character.
4. Do not end before extending characters or spacing marks. Characters
with the "mark" property always have the "extend" grapheme breaking
@@ -7494,7 +7494,7 @@ BACKTRACKING CONTROL
If the subject is "aaaac...", after the first match attempt fails
(starting at the first character in the string), the starting point
skips on to start the next attempt at "c". Note that a possessive quan-
tifer does not have the same effect as this example; although it would
tifier does not have the same effect as this example; although it would
suppress backtracking during the first match attempt, the second at-
tempt would start at the second character instead of skipping on to
"c".
@@ -7793,7 +7793,7 @@ PCRE SPECIAL CATEGORY PROPERTIES FOR \p and \P
Xan Alphanumeric: union of properties L and N
Xps POSIX space: property Z or tab, NL, VT, FF, CR
Xsp Perl space: property Z or tab, NL, VT, FF, CR
Xuc Univerally-named character: one that can be
Xuc Universally-named character: one that can be
represented by a Universal Character Name
Xwd Perl word: property Xan or underscore

View File

@@ -1699,7 +1699,7 @@ very long time, and so the \fImatch_limit\fP value is also used in this case
.P
The default value for the limit can be set when PCRE is built; the default
default is 10 million, which handles all but the most extreme cases. You can
override the default by suppling \fBpcre_exec()\fP with a \fBpcre_extra\fP
override the default by supplying \fBpcre_exec()\fP with a \fBpcre_extra\fP
block in which \fImatch_limit\fP is set, and PCRE_EXTRA_MATCH_LIMIT is set in
the \fIflags\fP field. If the limit is exceeded, \fBpcre_exec()\fP returns
PCRE_ERROR_MATCHLIMIT.
@@ -1726,7 +1726,7 @@ and is ignored, when matching is done using JIT compiled code.
.P
The default value for \fImatch_limit_recursion\fP can be set when PCRE is
built; the default default is the same value as the default for
\fImatch_limit\fP. You can override the default by suppling \fBpcre_exec()\fP
\fImatch_limit\fP. You can override the default by supplying \fBpcre_exec()\fP
with a \fBpcre_extra\fP block in which \fImatch_limit_recursion\fP is set, and
PCRE_EXTRA_MATCH_LIMIT_RECURSION is set in the \fIflags\fP field. If the limit
is exceeded, \fBpcre_exec()\fP returns PCRE_ERROR_RECURSIONLIMIT.
@@ -2044,10 +2044,10 @@ lookbehind. For example, consider the pattern
.sp
which finds occurrences of "iss" in the middle of words. (\eB matches only if
the current position in the subject is not a word boundary.) When applied to
the string "Mississipi" the first call to \fBpcre_exec()\fP finds the first
the string "Mississippi" the first call to \fBpcre_exec()\fP finds the first
occurrence. If \fBpcre_exec()\fP is called again with just the remainder of the
subject, namely "issipi", it does not match, because \eB is always false at the
start of the subject, which is deemed to be a word boundary. However, if
subject, namely "issippi", it does not match, because \eB is always false at
the start of the subject, which is deemed to be a word boundary. However, if
\fBpcre_exec()\fP is passed the entire string again, but with \fIstartoffset\fP
set to 4, it finds the second occurrence of "iss" because it is able to look
behind the starting point to discover that it is preceded by a letter.

View File

@@ -656,7 +656,7 @@ recognized.
.P
It is possible to restrict \eR to match only CR, LF, or CRLF (instead of the
complete set of Unicode line endings) by setting the option PCRE_BSR_ANYCRLF
either at compile time or when the pattern is matched. (BSR is an abbrevation
either at compile time or when the pattern is matched. (BSR is an abbreviation
for "backslash R".) This can be made the default when PCRE is built; if this is
the case, the other behaviour can be requested via the PCRE_BSR_UNICODE option.
It is also possible to specify these settings by starting a pattern string with
@@ -968,7 +968,7 @@ additional characters according to the following rules for ending a cluster:
3. Do not break Hangul (a Korean script) syllable sequences. Hangul characters
are of five types: L, V, T, LV, and LVT. An L character may be followed by an
L, V, LV, or LVT character; an LV or V character may be followed by a V or T
character; an LVT or T character may be follwed only by a T character.
character; an LVT or T character may be followed only by a T character.
.P
4. Do not end before extending characters or spacing marks. Characters with
the "mark" property always have the "extend" grapheme breaking property.
@@ -3115,7 +3115,7 @@ successful match. Consider:
.sp
If the subject is "aaaac...", after the first match attempt fails (starting at
the first character in the string), the starting point skips on to start the
next attempt at "c". Note that a possessive quantifer does not have the same
next attempt at "c". Note that a possessive quantifier does not have the same
effect as this example; although it would suppress backtracking during the
first match attempt, the second attempt would start at the second character
instead of skipping on to "c".

View File

@@ -123,7 +123,7 @@ is changed to use Unicode properties and they match many more characters.
Xan Alphanumeric: union of properties L and N
Xps POSIX space: property Z or tab, NL, VT, FF, CR
Xsp Perl space: property Z or tab, NL, VT, FF, CR
Xuc Univerally-named character: one that can be
Xuc Universally-named character: one that can be
represented by a Universal Character Name
Xwd Perl word: property Xan or underscore
.sp

View File

@@ -6,7 +6,7 @@
and semantics are as close as possible to those of the Perl 5 language.
Written by Philip Hazel
Copyright (c) 1997-2020 University of Cambridge
Copyright (c) 1997-2021 University of Cambridge
-----------------------------------------------------------------------------
Redistribution and use in source and binary forms, with or without
@@ -9102,6 +9102,8 @@ pcre_uchar cworkspace[COMPILE_WORK_SIZE];
similar way to cworkspace, it can be expanded using malloc() if necessary. */
named_group named_groups[NAMED_GROUP_LIST_SIZE];
cd->named_groups = named_groups;
cd->named_group_list_size = NAMED_GROUP_LIST_SIZE;
/* Set this early so that early errors get offset 0. */
@@ -9375,8 +9377,6 @@ cd->hwm = cworkspace;
cd->iscondassert = FALSE;
cd->start_workspace = cworkspace;
cd->workspace_size = COMPILE_WORK_SIZE;
cd->named_groups = named_groups;
cd->named_group_list_size = NAMED_GROUP_LIST_SIZE;
cd->start_pattern = (const pcre_uchar *)pattern;
cd->end_pattern = (const pcre_uchar *)(pattern + STRLEN_UC((const pcre_uchar *)pattern));
cd->req_varyopt = 0;
@@ -9487,6 +9487,7 @@ if (cd->names_found > 0)
add_name(cd, ng->name, ng->length, ng->number);
if (cd->named_group_list_size > NAMED_GROUP_LIST_SIZE)
(PUBL(free))((void *)cd->named_groups);
cd->named_group_list_size = 0; /* So we don't free it twice */
}
/* Set up a starting, non-extracting bracket, then compile the expression. On
@@ -9637,6 +9638,8 @@ if (errorcode != 0)
{
(PUBL(free))(re);
PCRE_EARLY_ERROR_RETURN:
if (cd->named_group_list_size > NAMED_GROUP_LIST_SIZE)
(PUBL(free))((void *)cd->named_groups);
*erroroffset = (int)(ptr - (const pcre_uchar *)pattern);
PCRE_EARLY_ERROR_RETURN2:
*errorptr = find_error_text(errorcode);

View File

@@ -6,7 +6,7 @@
and semantics are as close as possible to those of the Perl 5 language.
Written by Philip Hazel
Copyright (c) 1997-2018 University of Cambridge
Copyright (c) 1997-2021 University of Cambridge
-----------------------------------------------------------------------------
Redistribution and use in source and binary forms, with or without
@@ -764,7 +764,7 @@ for (;;)
md->mark = NULL; /* In case previously set by assertion */
RMATCH(eptr, ecode + PRIV(OP_lengths)[*ecode] + ecode[1], offset_top, md,
eptrb, RM55);
if ((rrc == MATCH_MATCH || rrc == MATCH_ACCEPT) &&
if ((rrc == MATCH_MATCH || rrc == MATCH_ACCEPT || rrc == MATCH_KETRPOS) &&
md->mark == NULL) md->mark = ecode + 2;
/* A return of MATCH_SKIP_ARG means that matching failed at SKIP with an

View File

@@ -5757,4 +5757,7 @@ AbcdCBefgBhiBqz
/(?&word)* \. (?<word> \w+ )/xi
pokus.hokus
/(?:A(*:X))*+/K
A
/-- End of testinput1 --/

View File

@@ -9470,4 +9470,9 @@ No match
0: pokus.hokus
1: hokus
/(?:A(*:X))*+/K
A
0: A
MK: X
/-- End of testinput1 --/

View File

@@ -12793,10 +12793,13 @@ order_clause:
created yet.
*/
SELECT_LEX *first_sl= unit->first_select();
if (unlikely(!unit->is_unit_op() &&
(first_sl->order_list.elements ||
first_sl->select_limit) &&
if (unlikely(!first_sl->next_select() && first_sl->tvc &&
unit->add_fake_select_lex(thd)))
MYSQL_YYABORT;
else if (unlikely(!unit->is_unit_op() &&
(first_sl->order_list.elements ||
first_sl->select_limit) &&
unit->add_fake_select_lex(thd)))
MYSQL_YYABORT;
}
if (sel->master_unit()->is_unit_op() && !sel->braces)
@@ -12845,7 +12848,8 @@ limit_clause_init:
LIMIT
{
SELECT_LEX *sel= Select;
if (sel->master_unit()->is_unit_op() && !sel->braces)
if (sel->master_unit()->is_unit_op() && !sel->braces &&
sel->master_unit()->fake_select_lex)
{
/* Move LIMIT that belongs to UNION to fake_select_lex */
Lex->current_select= sel->master_unit()->fake_select_lex;

View File

@@ -0,0 +1,130 @@
package wrappers;
import java.io.BufferedReader;
import java.io.Console;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Set;
public class Client2 {
static boolean DEBUG = true;
static final Console c = System.console();
static Mongo2Interface jdi = null;
public static void main(String[] args) {
int rc, m, i = 0;
boolean brc;
Set<String> columns;
String[] parms = new String[4];
jdi = new Mongo2Interface(DEBUG);
parms[0] = getLine("URI: ", false);
parms[1] = getLine("DB: ", false);
parms[2] = null;
parms[3] = null;
if (parms[0] == null)
parms[0] = "mongodb://localhost:27017";
if (parms[1] == null)
parms[1] = "test";
rc = jdi.MongoConnect(parms);
if (rc == 0) {
String name, pipeline, query, fields;
System.out.println("Successfully connected to " + parms[1]);
while ((name = getLine("Collection: ", false)) != null) {
if (jdi.GetCollection(name))
System.out.println("GetCollection failed");
else
System.out.println("Collection size: " + jdi.GetCollSize());
pipeline = getLine("Pipeline: ", false);
if (pipeline == null) {
query = getLine("Filter: ", false);
fields = getLine("Proj: ", false);
brc = jdi.FindColl(query, fields);
} else
brc = jdi.AggregateColl(pipeline);
System.out.println("Returned brc = " + brc);
if (!brc) {
for (i = 0; i < 10; i++) {
m = jdi.ReadNext();
if (m > 0) {
columns = jdi.GetColumns();
for (String col : columns)
System.out.println(col + "=" + jdi.GetField(col));
if (pipeline == null) {
if (name.equalsIgnoreCase("gtst"))
System.out.println("gtst=" + jdi.GetField("*"));
if (name.equalsIgnoreCase("inventory")) {
System.out.println("warehouse=" + jdi.GetField("instock.0.warehouse"));
System.out.println("quantity=" + jdi.GetField("instock.1.qty"));
} // endif inventory
if (name.equalsIgnoreCase("restaurants")) {
System.out.println("score=" + jdi.GetField("grades.0.score"));
System.out.println("date=" + jdi.GetField("grades.0.date"));
} // endif restaurants
} // endif pipeline
} else if (m < 0) {
System.out.println("ReadNext: " + jdi.GetErrmsg());
break;
} else
break;
} // endfor i
} // endif brc
} // endwhile name
rc = jdi.MongoDisconnect();
System.out.println("Disconnect returned " + rc);
} else
System.out.println(jdi.GetErrmsg() + " rc=" + rc);
} // end of main
// ==================================================================
private static String getLine(String p, boolean b) {
String response;
if (c != null) {
// Standard console mode
if (b) {
response = new String(c.readPassword(p));
} else
response = c.readLine(p);
} else {
// For instance when testing from Eclipse
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print(p);
try {
// Cannot suppress echo for password entry
response = in.readLine();
} catch (IOException e) {
response = "";
} // end of try/catch
} // endif c
return (response.isEmpty()) ? null : response;
} // end of getLine
} // end of class Client

View File

@@ -0,0 +1,154 @@
package wrappers;
import java.io.BufferedReader;
import java.io.Console;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Set;
public class Client3 {
static boolean DEBUG = true;
static final Console c = System.console();
static Mongo3Interface jdi = null;
public static void main(String[] args) {
int rc, level = 0;
boolean brc, desc = false;
Set<String> columns;
String[] parms = new String[4];
jdi = new Mongo3Interface(DEBUG);
parms[0] = getLine("URI: ", false);
parms[1] = getLine("Database: ", false);
parms[2] = null;
parms[3] = null;
if (parms[0] == null)
parms[0] = "mongodb://localhost:27017";
if (parms[1] == null)
parms[1] = "test";
rc = jdi.MongoConnect(parms);
if (rc == 0) {
String name, pipeline, query, fields;
System.out.println("Successfully connected to " + parms[0]);
while ((name = getLine("Collection: ", false)) != null) {
if (jdi.GetCollection(name))
System.out.println("GetCollection failed");
else
System.out.println("Collection size: " + jdi.GetCollSize());
pipeline = getLine("Pipeline: ", false);
if (pipeline == null || (desc = pipeline.equals("*"))) {
query = getLine("Filter: ", false);
fields = getLine("Proj: ", false);
if (desc)
level = Integer.parseInt(getLine("Level: ", false));
brc = jdi.FindColl(query, fields);
} else
brc = jdi.AggregateColl(pipeline);
System.out.println("Returned brc = " + brc);
if (!brc && !desc) {
for (int i = 0; jdi.ReadNext() > 0 && i < 10; i++) {
columns = jdi.GetColumns();
for (String col : columns)
System.out.println(col + "=" + jdi.GetField(col));
if (name.equalsIgnoreCase("gtst"))
System.out.println("gtst=" + jdi.GetField("*"));
if (name.equalsIgnoreCase("inventory")) {
System.out.println("warehouse=" + jdi.GetField("instock.0.warehouse"));
System.out.println("quantity=" + jdi.GetField("instock.1.qty"));
} // endif inventory
if (name.equalsIgnoreCase("restaurants")) {
System.out.println("score=" + jdi.GetField("grades.0.score"));
System.out.println("date=" + jdi.GetField("grades.0.date"));
} // endif inventory
} // endfor i
} else if (desc) {
int ncol;
for (int i = 0; (ncol = jdi.ReadNext()) > 0 && i < 2; i++) {
if (discovery(null, "", ncol, level))
break;
System.out.println("--------------");
} // endfor i
} // endif desc
} // endwhile query
rc = jdi.MongoDisconnect();
System.out.println("Disconnect returned " + rc);
} else
System.out.println(jdi.GetErrmsg() + " rc=" + rc);
} // end of main
private static boolean discovery(Object obj, String name, int ncol, int level) {
int[] val = new int[5];
Object ret = null;
String bvn = null;
for (int k = 0; k < ncol; k++) {
ret = jdi.ColumnDesc(obj, k, val, level);
bvn = jdi.ColDescName();
if (ret != null)
discovery(ret, name.concat(bvn).concat("."), val[4], level - 1);
else if (val[0] > 0)
System.out.println(
name + bvn + ": type=" + val[0] + " length=" + val[1] + " prec=" + val[2] + " nullable=" + val[3]);
else if (val[0] < 0)
System.out.println(jdi.GetErrmsg());
} // endfor k
return false;
} // end of discovery
// ==================================================================
private static String getLine(String p, boolean b) {
String response;
if (c != null) {
// Standard console mode
if (b) {
response = new String(c.readPassword(p));
} else
response = c.readLine(p);
} else {
// For instance when testing from Eclipse
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print(p);
try {
// Cannot suppress echo for password entry
response = in.readLine();
} catch (IOException e) {
response = "";
} // end of try/catch
} // endif c
return (response.isEmpty()) ? null : response;
} // end of getLine
} // end of class Client

View File

@@ -21,6 +21,7 @@ import com.mongodb.util.JSON;
public class Mongo2Interface {
boolean DEBUG = false;
String Errmsg = "No error";
String ovalName = null;
Set<String> Colnames = null;
Cursor cursor = null;
MongoClient client = null;
@@ -220,7 +221,7 @@ public class Mongo2Interface {
System.out.println("Class doc = " + doc.getClass());
Colnames = doc.keySet();
return 1;
return Colnames.size();
} else
return 0;
@@ -253,30 +254,106 @@ public class Mongo2Interface {
} // end of GetColumns
public String ColumnDesc(int n, int[] val) {
// if (rsmd == null) {
// System.out.println("No result metadata");
// return null;
// } else try {
// val[0] = rsmd.getColumnType(n);
// val[1] = rsmd.getPrecision(n);
// val[2] = rsmd.getScale(n);
// val[3] = rsmd.isNullable(n);
// return rsmd.getColumnLabel(n);
// } catch (SQLException se) {
// SetErrmsg(se);
// } //end try/catch
public Object ColumnDesc(Object obj, int n, int[] val, int lvl) {
Object ret = null;
Object oval = ((obj != null) ? obj : doc);
BasicDBObject dob = (oval instanceof BasicDBObject) ? (BasicDBObject) oval : null;
BasicDBList ary = (oval instanceof BasicDBList) ? (BasicDBList) oval : null;
try {
if (ary != null) {
oval = ary.get(n);
ovalName = Integer.toString(n);
} else if (dob != null) {
// String[] k = dob.keySet().toArray(new String[0]);
Object[] k = dob.keySet().toArray();
oval = dob.get(k[n]);
ovalName = (String) k[n];
} else
ovalName = "x" + Integer.toString(n);
if (DEBUG)
System.out.println("Class of " + ovalName + " = " + oval.getClass());
val[0] = 0; // ColumnType
val[1] = 0; // Precision
val[2] = 0; // Scale
val[3] = 0; // Nullable
val[4] = 0; // ncol
if (oval == null) {
val[3] = 1;
} else if (oval instanceof String) {
val[0] = 1;
val[1] = ((String) oval).length();
} else if (oval instanceof org.bson.types.ObjectId) {
val[0] = 1;
val[1] = ((org.bson.types.ObjectId) oval).toString().length();
} else if (oval instanceof Integer) {
val[0] = 7;
val[1] = Integer.toString(((Integer) oval).intValue()).length();
} else if (oval instanceof Long) {
val[0] = 5;
val[1] = Long.toString(((Long) oval).longValue()).length();
} else if (oval instanceof Date) {
Long TS = (((Date) oval).getTime() / 1000);
val[0] = 8;
val[1] = TS.toString().length();
} else if (oval instanceof Double) {
String d = Double.toString(((Double) oval).doubleValue());
int i = d.indexOf('.') + 1;
val[0] = 2;
val[1] = d.length();
val[2] = (i > 0) ? val[1] - i : 0;
} else if (oval instanceof Boolean) {
val[0] = 4;
val[1] = 1;
} else if (oval instanceof BasicDBObject) {
if (lvl > 0) {
ret = oval;
val[0] = 1;
val[4] = ((BasicDBObject) oval).size();
} else if (lvl == 0) {
val[0] = 1;
val[1] = oval.toString().length();
} // endif lvl
} else if (oval instanceof BasicDBList) {
if (lvl > 0) {
ret = oval;
val[0] = 2;
val[4] = ((BasicDBList) oval).size();
} else if (lvl == 0) {
val[0] = 1;
val[1] = oval.toString().length();
} // endif lvl
} else {
SetErrmsg("Type " + " of " + ovalName + " not supported");
val[0] = -1;
} // endif's
return ret;
} catch (Exception ex) {
SetErrmsg(ex);
} // end try/catch
val[0] = -1;
return null;
} // end of ColumnDesc
public String ColDescName() {
return ovalName;
} // end of ColDescName
protected Object GetFieldObject(String path) {
Object o = null;
BasicDBObject dob = null;
BasicDBList lst = null;
String[] names = null;
if (path == null || path.equals("*"))
if (path == null || path.equals("") || path.equals("*"))
return doc;
else if (doc instanceof BasicDBObject)
dob = doc;
@@ -325,9 +402,10 @@ public class Mongo2Interface {
if (o != null) {
if (o instanceof Date) {
Integer TS = (int) (((Date) o).getTime() / 1000);
Long TS = (((Date) o).getTime() / 1000);
return TS.toString();
} // endif Date
} else if (o instanceof Boolean)
return (Boolean) o ? "1" : "0";
return o.toString();
} else
@@ -335,13 +413,25 @@ public class Mongo2Interface {
} // end of GetField
public Object MakeBson(String s, int json) {
if (json == 1 || json == 2) {
return com.mongodb.util.JSON.parse(s);
} else
return null;
} // end of MakeBson
public Object MakeDocument() {
return new BasicDBObject();
} // end of MakeDocument
public boolean DocAdd(Object bdc, String key, Object val) {
public boolean DocAdd(Object bdc, String key, Object val, int json) {
try {
((BasicDBObject) bdc).append(key, val);
if (json != 0 && val instanceof String)
((BasicDBObject) bdc).append(key, JSON.parse((String) val));
else
((BasicDBObject) bdc).append(key, val);
} catch (MongoException me) {
SetErrmsg(me);
return true;
@@ -354,9 +444,13 @@ public class Mongo2Interface {
return new BasicDBList();
} // end of MakeArray
public boolean ArrayAdd(Object bar, int n, Object val) {
public boolean ArrayAdd(Object bar, int n, Object val, int json) {
try {
((BasicDBList) bar).put(n, val);
if (json != 0 && val instanceof String)
((BasicDBList) bar).put(n, JSON.parse((String) val));
else
((BasicDBList) bar).put(n, val);
} catch (MongoException me) {
SetErrmsg(me);
return true;

View File

@@ -1,5 +1,6 @@
package wrappers;
//import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
@@ -9,6 +10,7 @@ import java.util.Set;
import org.bson.BsonArray;
import org.bson.BsonBoolean;
import org.bson.BsonDateTime;
//import org.bson.BsonDecimal128;
import org.bson.BsonDocument;
import org.bson.BsonDouble;
import org.bson.BsonInt32;
@@ -18,6 +20,7 @@ import org.bson.BsonString;
import org.bson.BsonValue;
import org.bson.Document;
import org.bson.conversions.Bson;
//import org.bson.types.Decimal128;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
@@ -34,6 +37,7 @@ import com.mongodb.client.result.UpdateResult;
public class Mongo3Interface {
boolean DEBUG = false;
String Errmsg = "No error";
String bvalName = null;
Set<String> Colnames = null;
MongoClient client = null;
MongoDatabase db = null;
@@ -167,7 +171,7 @@ public class Mongo3Interface {
try {
if (query != null) {
Bson dbq = Document.parse((query != null) ? query : "{}");
Bson dbq = Document.parse(query);
finditer = coll.find(dbq);
} else
finditer = coll.find();
@@ -218,17 +222,23 @@ public class Mongo3Interface {
} // end of Rewind
public int ReadNext() {
if (cursor.hasNext()) {
doc = cursor.next();
try {
if (cursor.hasNext()) {
doc = cursor.next();
if (DEBUG)
System.out.println("Class doc = " + doc.getClass());
if (DEBUG)
System.out.println("Class doc = " + doc.getClass());
Colnames = doc.keySet();
return 1;
} else
return 0;
Colnames = doc.keySet();
return Colnames.size();
} else
return 0;
} catch (MongoException mx) {
SetErrmsg(mx);
} // end try/catch
return -1;
} // end of ReadNext
public boolean Fetch(int row) {
@@ -254,13 +264,11 @@ public class Mongo3Interface {
} // end of GetColumns
public String ColumnName(int n) {
int i = 1;
if (n < Colnames.size())
return (String) Colnames.toArray()[n];
else
return null;
for (String name : Colnames)
if (i++ == n)
return name;
return null;
} // end of ColumnName
public int ColumnType(int n, String name) {
@@ -278,30 +286,111 @@ public class Mongo3Interface {
return 666; // Not a type
} // end of ColumnType
public String ColumnDesc(int n, int[] val) {
// if (rsmd == null) {
// System.out.println("No result metadata");
// return null;
// } else try {
// val[0] = rsmd.getColumnType(n);
// val[1] = rsmd.getPrecision(n);
// val[2] = rsmd.getScale(n);
// val[3] = rsmd.isNullable(n);
// return rsmd.getColumnLabel(n);
// } catch (SQLException se) {
// SetErrmsg(se);
// } //end try/catch
public Object ColumnDesc(Object obj, int n, int[] val, int lvl) {
Object ret = null;
BsonValue bval = (BsonValue) ((obj != null) ? obj : doc);
BsonDocument dob = (bval instanceof BsonDocument) ? (BsonDocument) bval : null;
BsonArray ary = (bval instanceof BsonArray) ? (BsonArray) bval : null;
try {
if (ary != null) {
bval = ary.get(n);
bvalName = Integer.toString(n);
} else if (dob != null) {
// String[] k = dob.keySet().toArray(new String[0]);
Object[] k = dob.keySet().toArray();
bval = dob.get(k[n]);
bvalName = (String) k[n];
} else
bvalName = "x" + Integer.toString(n);
val[0] = 0; // ColumnType
val[1] = 0; // Precision
val[2] = 0; // Scale
val[3] = 0; // Nullable
val[4] = 0; // ncol
if (bval.isString()) {
val[0] = 1;
val[1] = bval.asString().getValue().length();
} else if (bval.isInt32()) {
val[0] = 7;
val[1] = Integer.toString(bval.asInt32().getValue()).length();
} else if (bval.isInt64()) {
val[0] = 5;
val[1] = Long.toString(bval.asInt64().getValue()).length();
} else if (bval.isObjectId()) {
val[0] = 1;
val[1] = bval.asObjectId().getValue().toString().length();
} else if (bval.isDateTime()) {
Long TS = (bval.asDateTime().getValue() / 1000);
val[0] = 8;
val[1] = TS.toString().length();
} else if (bval.isDouble()) {
String d = Double.toString(bval.asDouble().getValue());
int i = d.indexOf('.') + 1;
val[0] = 2;
val[1] = d.length();
val[2] = (i > 0) ? val[1] - i : 0;
} else if (bval.isBoolean()) {
val[0] = 4;
val[1] = 1;
} else if (bval.isDocument()) {
if (lvl > 0) {
ret = bval;
val[0] = 1;
val[4] = bval.asDocument().keySet().size();
} else if (lvl == 0) {
val[0] = 1;
val[1] = bval.asDocument().toJson().length();
} // endif lvl
} else if (bval.isArray()) {
if (lvl > 0) {
ret = bval;
val[0] = 2;
val[4] = bval.asArray().size();
} else if (lvl == 0) {
val[0] = 1;
util = new BsonDocument("arr", bval.asArray());
String s = util.toJson();
int i1 = s.indexOf('[');
int i2 = s.lastIndexOf(']');
val[1] = i2 - i1 + 1;
} // endif lvl
} else if (bval.isDecimal128()) {
val[0] = 9;
val[1] = bval.asDecimal128().toString().length();
} else if (bval.isNull()) {
val[0] = 0;
val[3] = 1;
} else {
SetErrmsg("Type " + bval.getBsonType() + " of " + bvalName + " not supported");
val[0] = -1;
} // endif's
return ret;
} catch (Exception ex) {
SetErrmsg(ex);
} // end try/catch
val[0] = -1;
return null;
} // end of ColumnDesc
public String ColDescName() {
return bvalName;
} // end of ColDescName
protected BsonValue GetFieldObject(String path) {
BsonValue o = doc;
BsonDocument dob = null;
BsonArray ary = null;
String[] names = null;
if (path == null || path.equals("*"))
if (path == null || path.equals("") || path.equals("*"))
return doc;
else if (o instanceof BsonDocument)
dob = doc;
@@ -362,6 +451,8 @@ public class Mongo3Interface {
return TS.toString();
} else if (o.isDouble()) {
return Double.toString(o.asDouble().getValue());
} else if (o.isBoolean()) {
return o.asBoolean().getValue() ? "1" : "0";
} else if (o.isDocument()) {
return o.asDocument().toJson();
} else if (o.isArray()) {
@@ -370,6 +461,8 @@ public class Mongo3Interface {
int i1 = s.indexOf('[');
int i2 = s.lastIndexOf(']');
return s.substring(i1, i2 + 1);
} else if (o.isDecimal128()) {
return o.asDecimal128().toString();
} else if (o.isNull()) {
return null;
} else
@@ -380,14 +473,33 @@ public class Mongo3Interface {
} // end of GetField
protected BsonValue ObjToBson(Object val) {
public Object MakeBson(String s, int json) {
BsonValue bval;
if (json == 1)
bval = BsonDocument.parse(s);
else if (json == 2)
bval = BsonArray.parse(s);
else
bval = null;
return bval;
} // end of MakeBson
protected BsonValue ObjToBson(Object val, int json) {
BsonValue bval = null;
if (val == null)
bval = bsonull;
else if (val.getClass() == String.class)
bval = new BsonString((String) val);
else if (val.getClass() == Integer.class)
else if (val.getClass() == String.class) {
if (json == 1)
bval = BsonDocument.parse((String) val);
else if (json == 2)
bval = BsonArray.parse((String) val);
else
bval = new BsonString((String) val);
} else if (val.getClass() == Integer.class)
bval = new BsonInt32((int) val);
else if (val.getClass() == Double.class)
bval = new BsonDouble((double) val);
@@ -401,6 +513,8 @@ public class Mongo3Interface {
bval = (BsonDocument) val;
else if (val.getClass() == BsonArray.class)
bval = (BsonArray) val;
// else if (val.getClass() == BigDecimal.class)
// bval = new BsonDecimal128((BigDecimal) val);
return bval;
} // end of ObjToBson
@@ -409,9 +523,9 @@ public class Mongo3Interface {
return new BsonDocument();
} // end of MakeDocument
public boolean DocAdd(Object bdc, String key, Object val) {
public boolean DocAdd(Object bdc, String key, Object val, int json) {
try {
((BsonDocument) bdc).append(key, ObjToBson(val));
((BsonDocument) bdc).append(key, ObjToBson(val, json));
} catch (MongoException me) {
SetErrmsg(me);
return true;
@@ -424,12 +538,12 @@ public class Mongo3Interface {
return new BsonArray();
} // end of MakeArray
public boolean ArrayAdd(Object bar, int n, Object val) {
public boolean ArrayAdd(Object bar, int n, Object val, int json) {
try {
for (int i = ((BsonArray) bar).size(); i < n; i++)
((BsonArray) bar).add(bsonull);
((BsonArray) bar).add(ObjToBson(val));
((BsonArray) bar).add(ObjToBson(val, json));
} catch (MongoException me) {
SetErrmsg(me);
return true;
@@ -501,4 +615,4 @@ public class Mongo3Interface {
return n;
} // end of CollDelete
} // end of class MongoInterface
} // end of class Mongo3Interface

View File

@@ -0,0 +1,131 @@
package wrappers;
import java.io.BufferedReader;
import java.io.Console;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;
public class TestInsert2 {
static boolean DEBUG = true;
static final Console c = System.console();
static Mongo2Interface jdi = null;
public static void main(String[] args) {
int rc;
String[] parms = new String[4];
jdi = new Mongo2Interface(DEBUG);
parms[0] = getLine("URI: ", false);
parms[1] = getLine("Database: ", false);
parms[2] = null;
parms[3] = null;
if (parms[0] == null)
parms[0] = "mongodb://localhost:27017";
if (parms[1] == null)
parms[1] = "test";
rc = jdi.MongoConnect(parms);
if (rc == 0) {
Object bdoc = jdi.MakeDocument();
if (jdi.DocAdd(bdoc, "_id", (Object) 1, 0))
System.out.println(jdi.GetErrmsg());
if (jdi.DocAdd(bdoc, "Name", (Object) "Smith", 0))
System.out.println(jdi.GetErrmsg());
if (jdi.DocAdd(bdoc, "Age", (Object) 39, 0))
System.out.println(jdi.GetErrmsg());
if (jdi.DocAdd(bdoc, "Pi", (Object) 3.14, 0))
System.out.println(jdi.GetErrmsg());
if (jdi.DocAdd(bdoc, "Phone", (Object) "{\"ext\":[4,5,7]}", 1))
System.out.println(jdi.GetErrmsg());
if (jdi.DocAdd(bdoc, "Scores", (Object) "[24,2,13]", 2))
System.out.println(jdi.GetErrmsg());
Object bar = jdi.MakeArray();
for (int i = 1; i < 3; i++)
if (jdi.ArrayAdd(bar, i, (Object) (Math.random() * 10.0), 0))
System.out.println(jdi.GetErrmsg());
if (jdi.DocAdd(bdoc, "Prices", bar, 0))
System.out.println(jdi.GetErrmsg());
Object dat = new Date();
if (jdi.DocAdd(bdoc, "Date", dat, 0))
System.out.println(jdi.GetErrmsg());
System.out.println(bdoc);
// Try to update
if (!jdi.GetCollection("updtest") && !jdi.FindColl(null, null)) {
if (jdi.CollDelete(true) < 0)
System.out.println(jdi.GetErrmsg());
if (jdi.CollInsert(bdoc))
System.out.println(jdi.GetErrmsg());
Object updlist = jdi.MakeDocument();
if (jdi.DocAdd(updlist, "Age", (Object) 45, 0))
System.out.println(jdi.GetErrmsg());
Object upd = jdi.MakeDocument();
if (jdi.DocAdd(upd, "$set", updlist, 0))
System.out.println(jdi.GetErrmsg());
if (jdi.ReadNext() > 0 && jdi.CollUpdate(upd) < 0)
System.out.println(jdi.GetErrmsg());
if (!jdi.Rewind() && jdi.ReadNext() > 0)
System.out.println(jdi.GetDoc());
else
System.out.println("Failed Rewind");
} // endif n
} // endif rc
} // end of main
// ==================================================================
private static String getLine(String p, boolean b) {
String response;
if (c != null) {
// Standard console mode
if (b) {
response = new String(c.readPassword(p));
} else
response = c.readLine(p);
} else {
// For instance when testing from Eclipse
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print(p);
try {
// Cannot suppress echo for password entry
response = in.readLine();
} catch (IOException e) {
response = "";
} // end of try/catch
} // endif c
return (response.isEmpty()) ? null : response;
} // end of getLine
}

View File

@@ -0,0 +1,131 @@
package wrappers;
import java.io.BufferedReader;
import java.io.Console;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;
public class TestInsert3 {
static boolean DEBUG = true;
static final Console c = System.console();
static Mongo3Interface jdi = null;
public static void main(String[] args) {
int rc;
String[] parms = new String[4];
jdi = new Mongo3Interface(DEBUG);
parms[0] = getLine("URI: ", false);
parms[1] = getLine("Database: ", false);
parms[2] = null;
parms[3] = null;
if (parms[0] == null)
parms[0] = "mongodb://localhost:27017";
if (parms[1] == null)
parms[1] = "test";
rc = jdi.MongoConnect(parms);
if (rc == 0) {
Object bdoc = jdi.MakeDocument();
if (jdi.DocAdd(bdoc, "_id", (Object) 1, 0))
System.out.println(jdi.GetErrmsg());
if (jdi.DocAdd(bdoc, "Name", (Object) "Smith", 0))
System.out.println(jdi.GetErrmsg());
if (jdi.DocAdd(bdoc, "Age", (Object) 39, 0))
System.out.println(jdi.GetErrmsg());
if (jdi.DocAdd(bdoc, "Pi", (Object) 3.14, 0))
System.out.println(jdi.GetErrmsg());
if (jdi.DocAdd(bdoc, "Phone", (Object) "{\"ext\":[4,5,7]}", 1))
System.out.println(jdi.GetErrmsg());
if (jdi.DocAdd(bdoc, "Scores", (Object) "[24,2,13]", 2))
System.out.println(jdi.GetErrmsg());
Object bar = jdi.MakeArray();
for (int i = 0; i < 2; i++)
if (jdi.ArrayAdd(bar, i, (Object) (Math.random() * 10.0), 0))
System.out.println(jdi.GetErrmsg());
if (jdi.DocAdd(bdoc, "Prices", bar, 0))
System.out.println(jdi.GetErrmsg());
Object dat = new Date();
if (jdi.DocAdd(bdoc, "Date", dat, 0))
System.out.println(jdi.GetErrmsg());
System.out.println(bdoc);
// Try to update
if (!jdi.GetCollection("updtest") && !jdi.FindColl(null, null)) {
if (jdi.CollDelete(true) < 0)
System.out.println(jdi.GetErrmsg());
if (jdi.CollInsert(bdoc))
System.out.println(jdi.GetErrmsg());
Object updlist = jdi.MakeDocument();
if (jdi.DocAdd(updlist, "Age", (Object) 40, 0))
System.out.println(jdi.GetErrmsg());
Object upd = jdi.MakeDocument();
if (jdi.DocAdd(upd, "$set", updlist, 0))
System.out.println(jdi.GetErrmsg());
if (jdi.ReadNext() > 0 && jdi.CollUpdate(upd) < 0)
System.out.println(jdi.GetErrmsg());
if (!jdi.Rewind() && jdi.ReadNext() > 0)
System.out.println(jdi.GetDoc());
else
System.out.println("Failed Rewind");
} // endif n
} // endif rc
} // end of main
// ==================================================================
private static String getLine(String p, boolean b) {
String response;
if (c != null) {
// Standard console mode
if (b) {
response = new String(c.readPassword(p));
} else
response = c.readLine(p);
} else {
// For instance when testing from Eclipse
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print(p);
try {
// Cannot suppress echo for password entry
response = in.readLine();
} catch (IOException e) {
response = "";
} // end of try/catch
} // endif c
return (response.isEmpty()) ? null : response;
} // end of getLine
}

View File

@@ -19,14 +19,14 @@
#include "sql_class.h"
//#include "sql_time.h"
#if defined(__WIN__)
#if defined(_WIN32)
//#include <windows.h>
#else // !__WIN__
#else // !_WIN32
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdint.h> // for uintprt_h
#endif // !__WIN__
#endif // !_WIN32
/***********************************************************************/
/* Include required application header files */

View File

@@ -20,13 +20,13 @@
#include "sql_class.h"
//#include "sql_time.h"
#if defined(__WIN__)
#if defined(_WIN32)
//#include <windows.h>
#else // !__WIN__
#else // !_WIN32
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#endif // !__WIN__
#endif // !_WIN32
/***********************************************************************/
/* Include application header files: */

View File

@@ -24,11 +24,11 @@
#if !defined(BLOCK_DEFINED)
#define BLOCK_DEFINED
#if defined(__WIN__) && !defined(NOEX)
#if defined(_WIN32) && !defined(NOEX)
#define DllExport __declspec( dllexport )
#else // !__WIN__
#else // !_WIN32
#define DllExport
#endif // !__WIN__
#endif // !_WIN32
/***********************************************************************/
/* Definition of class BLOCK with its method function new. */

View File

@@ -30,7 +30,7 @@
#define CheckType(X,Y)
#endif
#if defined(__WIN__)
#if defined(_WIN32)
#define EL "\r\n"
#else
#define EL "\n"
@@ -1205,15 +1205,14 @@ void BJSON::SetArrayValue(PBVAL bap, PBVAL nvp, int n)
int i = 0;
PBVAL bvp = NULL;
if (bap->To_Val)
for (bvp = GetArray(bap); bvp; i++, bvp = GetNext(bvp))
if (i == n) {
SetValueVal(bvp, nvp);
return;
}
for (bvp = GetArray(bap); i < n; i++, bvp = bvp ? GetNext(bvp) : NULL)
if (!bvp)
AddArrayValue(bap, NewVal());
if (!bvp)
AddArrayValue(bap, MOF(nvp));
else
SetValueVal(bvp, nvp);
} // end of SetValue

View File

@@ -1889,24 +1889,31 @@ static int *GetIntArgPtr(PGLOBAL g, UDF_ARGS *args, uint& n)
/*********************************************************************************/
int IsArgJson(UDF_ARGS *args, uint i)
{
int n = 0;
const char *pat = args->attributes[i];
int n = 0;
if (*pat == '@') {
pat++;
if (*pat == '\'' || *pat == '"')
pat++;
} // endif pat
if (i >= args->arg_count || args->arg_type[i] != STRING_RESULT) {
} else if (!strnicmp(args->attributes[i], "Bson_", 5) ||
!strnicmp(args->attributes[i], "Json_", 5)) {
} else if (!strnicmp(pat, "Bson_", 5) || !strnicmp(pat, "Json_", 5)) {
if (!args->args[i] || strchr("[{ \t\r\n", *args->args[i]))
n = 1; // arg should be is a json item
// else
// n = 2; // A file name may have been returned
} else if (!strnicmp(args->attributes[i], "Bbin_", 5)) {
} else if (!strnicmp(pat, "Bbin_", 5)) {
if (args->lengths[i] == sizeof(BSON))
n = 3; // arg is a binary json item
// else
// n = 2; // A file name may have been returned
} else if (!strnicmp(args->attributes[i], "Bfile_", 6) ||
!strnicmp(args->attributes[i], "Jfile_", 6)) {
} else if (!strnicmp(pat, "Bfile_", 6) || !strnicmp(pat, "Jfile_", 6)) {
n = 2; // arg is a json file name
#if 0
} else if (args->lengths[i]) {
@@ -4682,7 +4689,7 @@ char *bfile_convert(UDF_INIT* initid, UDF_ARGS* args, char* result,
str = (char*)g->Xchk;
if (!str) {
PUSH_WARNING(g->Message ? g->Message : "Unexpected error");
PUSH_WARNING(*g->Message ? g->Message : "Unexpected error");
*is_null = 1;
*error = 1;
*res_length = 0;
@@ -4742,7 +4749,7 @@ char *bfile_bjson(UDF_INIT *initid, UDF_ARGS *args, char *result,
if (!g->Xchk) {
int msgid = MSGID_OPEN_MODE_STRERROR;
FILE *fout;
FILE *fout = NULL;
FILE *fin;
if (!(fin = global_fopen(g, msgid, fn, "rt")))
@@ -4805,7 +4812,7 @@ char *bfile_bjson(UDF_INIT *initid, UDF_ARGS *args, char *result,
str = (char*)g->Xchk;
if (!str) {
if (g->Message)
if (*g->Message)
str = strcpy(result, g->Message);
else
str = strcpy(result, "Unexpected error");

View File

@@ -56,6 +56,7 @@ CMGFAM::CMGFAM(PJDEF tdp) : DOSFAM((PDOSDEF)NULL)
Pcg.Coll_name = tdp->Collname;
Pcg.Options = tdp->Options;
Pcg.Filter = tdp->Filter;
Pcg.Line = NULL;
Pcg.Pipe = tdp->Pipe && tdp->Options != NULL;
Lrecl = tdp->Lrecl + tdp->Ending;
} else {
@@ -64,6 +65,7 @@ CMGFAM::CMGFAM(PJDEF tdp) : DOSFAM((PDOSDEF)NULL)
Pcg.Coll_name = NULL;
Pcg.Options = NULL;
Pcg.Filter = NULL;
Pcg.Line = NULL;
Pcg.Pipe = false;
Lrecl = 0;
} // endif tdp
@@ -88,6 +90,7 @@ CMGFAM::CMGFAM(PBDEF tdp) : DOSFAM((PDOSDEF)NULL)
Pcg.Coll_name = tdp->Collname;
Pcg.Options = tdp->Options;
Pcg.Filter = tdp->Filter;
Pcg.Line = NULL;
Pcg.Pipe = tdp->Pipe && tdp->Options != NULL;
Lrecl = tdp->Lrecl + tdp->Ending;
} else {
@@ -96,6 +99,7 @@ CMGFAM::CMGFAM(PBDEF tdp) : DOSFAM((PDOSDEF)NULL)
Pcg.Coll_name = NULL;
Pcg.Options = NULL;
Pcg.Filter = NULL;
Pcg.Line = NULL;
Pcg.Pipe = false;
Lrecl = 0;
} // endif tdp
@@ -280,6 +284,7 @@ int CMGFAM::ReadBuffer(PGLOBAL g)
/***********************************************************************/
int CMGFAM::WriteBuffer(PGLOBAL g)
{
Pcg.Line = Tdbp->GetLine();
return Cmgp->Write(g);
} // end of WriteBuffer

View File

@@ -1,7 +1,7 @@
/************ CMgoConn C++ Functions Source Code File (.CPP) ***********/
/* Name: CMgoConn.CPP Version 1.0 */
/* Name: CMgoConn.CPP Version 1.1 */
/* */
/* (C) Copyright to the author Olivier BERTRAND 2017 */
/* (C) Copyright to the author Olivier BERTRAND 2017 - 2021 */
/* */
/* This file contains the MongoDB C connection classes functions. */
/***********************************************************************/
@@ -24,8 +24,9 @@
bool CMgoConn::IsInit = false;
bool IsNum(PSZ s);
bool IsArray(PSZ s);
bool MakeSelector(PGLOBAL g, PFIL fp, PSTRG s);
int GetDefaultPrec(void);
/* --------------------------- Class INCOL --------------------------- */
@@ -47,12 +48,13 @@ void INCOL::AddCol(PGLOBAL g, PCOL colp, char *jp)
break;
if (!kp) {
icp = new(g) INCOL(IsNum(p));
icp = new(g) INCOL();
kcp = (PKC)PlugSubAlloc(g, NULL, sizeof(KEYCOL));
kcp->Next = NULL;
kcp->Incolp = icp;
kcp->Colp = NULL;
kcp->Key = PlugDup(g, jp);
kcp->Array = IsArray(p);
if (Klist) {
for (kp = Klist; kp->Next; kp = kp->Next);
@@ -73,6 +75,7 @@ void INCOL::AddCol(PGLOBAL g, PCOL colp, char *jp)
kcp->Incolp = NULL;
kcp->Colp = colp;
kcp->Key = jp;
kcp->Array = IsArray(jp);
if (Klist) {
for (kp = Klist; kp->Next; kp = kp->Next);
@@ -120,11 +123,12 @@ CMgoConn::CMgoConn(PGLOBAL g, PCPARM pcg)
{
Pcg = pcg;
Uri = NULL;
Pool = NULL;
//Pool = NULL;
Client = NULL;
Database = NULL;
Collection = NULL;
Cursor = NULL;
Document = NULL;
Query = NULL;
Opts = NULL;
Fpc = NULL;
@@ -157,24 +161,26 @@ bool CMgoConn::Connect(PGLOBAL g)
} // endif name
if (!IsInit)
#if defined(__WIN__)
#if defined(_WIN32)
__try {
mongo_init(true);
} __except (EXCEPTION_EXECUTE_HANDLER) {
strcpy(g->Message, "Cannot load MongoDB C driver");
return true;
} // end try/except
#else // !__WIN__
#else // !_WIN32
mongo_init(true);
#endif // !__WIN__
#endif // !_WIN32
Uri = mongoc_uri_new(Pcg->Uristr);
Uri = mongoc_uri_new_with_error(Pcg->Uristr, &Error);
if (!Uri) {
sprintf(g->Message, "Failed to parse URI: \"%s\"", Pcg->Uristr);
sprintf(g->Message, "Failed to parse URI: \"%s\" Msg: %s",
Pcg->Uristr, Error.message);
return true;
} // endif Uri
#if 0
// Create a new client pool instance
Pool = mongoc_client_pool_new(Uri);
mongoc_client_pool_set_error_api(Pool, 2);
@@ -185,13 +191,24 @@ bool CMgoConn::Connect(PGLOBAL g)
// Create a new client instance
Client = mongoc_client_pool_pop(Pool);
#else
// Create a new client instance
Client = mongoc_client_new_from_uri (Uri);
if (!Client) {
sprintf(g->Message, "Failed to get Client");
return true;
} // endif Client
// Get a handle on the collection Coll_name
// Register the application name so we can track it in the profile logs
// on the server. This can also be done from the URI (see other examples).
mongoc_client_set_appname (Client, "Connect");
// Get a handle on the database
// Database = mongoc_client_get_database (Client, Pcg->Db_name);
#endif // 0
// Get a handle on the collection
Collection = mongoc_client_get_collection(Client, Pcg->Db_name, Pcg->Coll_name);
if (!Collection) {
@@ -228,8 +245,8 @@ bool CMgoConn::Connect(PGLOBAL g)
int CMgoConn::CollSize(PGLOBAL g)
{
int cnt;
bson_t *query;
const char *jf = NULL;
bson_t* query;
const char* jf = NULL;
if (Pcg->Pipe)
return 10;
@@ -237,7 +254,7 @@ int CMgoConn::CollSize(PGLOBAL g)
jf = Pcg->Filter;
if (jf) {
query = bson_new_from_json((const uint8_t *)jf, -1, &Error);
query = bson_new_from_json((const uint8_t*)jf, -1, &Error);
if (!query) {
htrc("Wrong filter: %s", Error.message);
@@ -247,8 +264,17 @@ int CMgoConn::CollSize(PGLOBAL g)
} else
query = bson_new();
#if defined(DEVELOPMENT)
if (jf)
cnt = (int)mongoc_collection_count_documents(Collection,
query, NULL, NULL, NULL, &Error);
else
cnt = (int)mongoc_collection_estimated_document_count(
Collection, NULL, NULL, NULL, &Error);
#else
cnt = (int)mongoc_collection_count(Collection,
MONGOC_QUERY_NONE, query, 0, 0, NULL, &Error);
MONGOC_QUERY_NONE, query, 0, 0, NULL, &Error);
#endif
if (cnt < 0) {
htrc("Collection count: %s", Error.message);
@@ -260,30 +286,91 @@ int CMgoConn::CollSize(PGLOBAL g)
} // end of CollSize
/***********************************************************************/
/* OpenDB: Data Base open routine for MONGO access method. */
/* Project: make the projection avoid path collision. */
/***********************************************************************/
void CMgoConn::Project(PGLOBAL g, PSTRG s)
{
bool m, b = false;
size_t n;
PSZ path;
PCOL cp;
PTDB tp = Pcg->Tdbp;
PTHP hp, php = NULL, * nphp = &php;
for (cp = tp->GetColumns(); cp; cp = cp->GetNext()) {
path = cp->GetJpath(g, true);
// Resolve path collision
for (hp = php; hp; hp = hp->Next) {
if (strlen(path) < strlen(hp->Path)) {
n = strlen(path);
m = true;
} else {
n = strlen(hp->Path);
m = false;
} // endif path
if (!strncmp(path, hp->Path, n))
break;
} // endfor hp
if (!hp) {
// New path
hp = (PTHP)PlugSubAlloc(g, NULL, sizeof(PTH));
hp->Path = path;
hp->Name = cp->GetName();
hp->Next = NULL;
*nphp = hp;
nphp = &hp->Next;
} else if (m) // Smaller path must replace longer one
hp->Path = path;
} // endfor cp
for (hp = php; hp; hp = hp->Next) {
if (b)
s->Append(",\"");
else
b = true;
if (*hp->Path == '{') {
// This is a Mongo defined column
s->Append(hp->Name);
s->Append("\":");
s->Append(hp->Path);
} else {
s->Append(hp->Path);
s->Append("\":1");
} // endif Path
} // endfor hp
} // end of Project
/***********************************************************************/
/* MakeCursor: make the cursor used to retrieve documents. */
/***********************************************************************/
bool CMgoConn::MakeCursor(PGLOBAL g)
{
const char *p;
bool id, b = false, all = false;
bool id, all = false;
PCSZ options = Pcg->Options;
PTDB tp = Pcg->Tdbp;
PCOL cp;
PSTRG s = NULL;
PFIL filp = tp->GetFilter();
id = (tp->GetMode() != MODE_READ);
id = (tp->GetMode() == MODE_UPDATE || tp->GetMode() == MODE_DELETE);
if (options && !stricmp(options, "all")) {
options = NULL;
all = true;
} // endif Options
for (cp = tp->GetColumns(); cp; cp = cp->GetNext())
if (!strcmp(cp->GetName(), "_id"))
id = true;
else if (cp->GetFmt() && !strcmp(cp->GetFmt(), "*") && !options)
} else for (cp = tp->GetColumns(); cp && !all; cp = cp->GetNext())
if (cp->GetFmt() && !strcmp(cp->GetFmt(), "*") && !options)
all = true;
else if (!id)
id = !strcmp(cp->GetFmt() ? cp->GetFmt() : cp->GetName(), "_id");
if (Pcg->Pipe) {
if (trace(1))
@@ -311,23 +398,14 @@ bool CMgoConn::MakeCursor(PGLOBAL g)
tp->SetFilter(NULL); // Not needed anymore
} // endif To_Filter
if (!all && tp->GetColumns()) {
if (tp->GetColumns() && !strstr(s->GetStr(), "$project")) {
// Project list
s->Append(",{\"$project\":{\"");
if (!id)
s->Append("_id\":0,\"");
for (cp = tp->GetColumns(); cp; cp = cp->GetNext()) {
if (b)
s->Append(",\"");
else
b = true;
s->Append(cp->GetJpath(g, true));
s->Append("\":1");
} // endfor cp
Project(g, s);
s->Append("}}");
} // endif all
@@ -377,7 +455,7 @@ bool CMgoConn::MakeCursor(PGLOBAL g)
if (MakeSelector(g, filp, s)) {
strcpy(g->Message, "Failed making selector");
return NULL;
return true;
} // endif Selector
tp->SetFilter(NULL); // Not needed anymore
@@ -391,7 +469,7 @@ bool CMgoConn::MakeCursor(PGLOBAL g)
if (!Query) {
sprintf(g->Message, "Wrong filter: %s", Error.message);
return NULL;
return true;
} // endif Query
} else
@@ -413,16 +491,7 @@ bool CMgoConn::MakeCursor(PGLOBAL g)
if (!id)
s->Append("_id\":0,\"");
for (cp = tp->GetColumns(); cp; cp = cp->GetNext()) {
if (b)
s->Append(",\"");
else
b = true;
s->Append(cp->GetJpath(g, true));
s->Append("\":1");
} // endfor cp
Project(g, s);
s->Append("}}");
s->Resize(s->GetLength() + 1);
p = s->GetStr();
@@ -435,7 +504,7 @@ bool CMgoConn::MakeCursor(PGLOBAL g)
if (!Opts) {
sprintf(g->Message, "Wrong options: %s", Error.message);
return NULL;
return true;
} // endif Opts
} // endif all
@@ -495,44 +564,54 @@ void CMgoConn::ShowDocument(bson_iter_t *iter, const bson_t *doc, const char *k)
key = bson_iter_key(iter);
htrc("Found element key: \"%s\"\n", key);
if (BSON_ITER_HOLDS_UTF8(iter))
htrc("%s.%s=\"%s\"\n", k, key, bson_iter_utf8(iter, NULL));
else if (BSON_ITER_HOLDS_INT32(iter))
htrc("%s.%s=%d\n", k, key, bson_iter_int32(iter));
else if (BSON_ITER_HOLDS_INT64(iter))
htrc("%s.%s=%lld\n", k, key, bson_iter_int64(iter));
else if (BSON_ITER_HOLDS_DOUBLE(iter))
htrc("%s.%s=%g\n", k, key, bson_iter_double(iter));
else if (BSON_ITER_HOLDS_DATE_TIME(iter))
htrc("%s.%s=date(%lld)\n", k, key, bson_iter_date_time(iter));
else if (BSON_ITER_HOLDS_OID(iter)) {
char str[25];
switch (bson_iter_type(iter)) {
case BSON_TYPE_UTF8:
htrc("%s.%s=\"%s\"\n", k, key, bson_iter_utf8(iter, NULL));
break;
case BSON_TYPE_INT32:
htrc("%s.%s=%d\n", k, key, bson_iter_int32(iter));
break;
case BSON_TYPE_INT64:
htrc("%s.%s=%lld\n", k, key, bson_iter_int64(iter));
break;
case BSON_TYPE_DOUBLE:
htrc("%s.%s=%g\n", k, key, bson_iter_double(iter));
break;
case BSON_TYPE_DATE_TIME:
htrc("%s.%s=date(%lld)\n", k, key, bson_iter_date_time(iter));
break;
case BSON_TYPE_OID: {
char str[25];
bson_oid_to_string(bson_iter_oid(iter), str);
htrc("%s.%s=%s\n", k, key, str);
} else if (BSON_ITER_HOLDS_DECIMAL128(iter)) {
char *str = NULL;
bson_decimal128_t dec;
bson_oid_to_string(bson_iter_oid(iter), str);
htrc("%s.%s=%s\n", k, key, str);
} break;
case BSON_TYPE_DECIMAL128: {
char str[BSON_DECIMAL128_STRING];
bson_decimal128_t dec;
bson_iter_decimal128(iter, &dec);
bson_decimal128_to_string(&dec, str);
htrc("%s.%s=%s\n", k, key, str);
} else if (BSON_ITER_HOLDS_DOCUMENT(iter)) {
bson_iter_t child;
bson_iter_decimal128(iter, &dec);
bson_decimal128_to_string(&dec, str);
htrc("%s.%s=%s\n", k, key, str);
} break;
case BSON_TYPE_DOCUMENT: {
bson_iter_t child;
if (bson_iter_recurse(iter, &child))
ShowDocument(&child, NULL, key);
if (bson_iter_recurse(iter, &child))
ShowDocument(&child, NULL, key);
} else if (BSON_ITER_HOLDS_ARRAY(iter)) {
bson_t *arr;
bson_iter_t itar;
const uint8_t *data = NULL;
uint32_t len = 0;
} break;
case BSON_TYPE_ARRAY: {
bson_t* arr;
bson_iter_t itar;
const uint8_t* data = NULL;
uint32_t len = 0;
bson_iter_array(iter, &len, &data);
arr = bson_new_from_data(data, len);
ShowDocument(&itar, arr, key);
} // endif's
bson_iter_array(iter, &len, &data);
arr = bson_new_from_data(data, len);
ShowDocument(&itar, arr, key);
} break;
} // endswitch iter
} // endwhile bson_iter_next
@@ -545,7 +624,7 @@ void CMgoConn::ShowDocument(bson_iter_t *iter, const bson_t *doc, const char *k)
/***********************************************************************/
void CMgoConn::MakeColumnGroups(PGLOBAL g)
{
Fpc = new(g) INCOL(false);
Fpc = new(g) INCOL();
for (PCOL colp = Pcg->Tdbp->GetColumns(); colp; colp = colp->GetNext())
if (!colp->IsSpecial())
@@ -560,7 +639,7 @@ bool CMgoConn::DocWrite(PGLOBAL g, PINCOL icp)
{
for (PKC kp = icp->Klist; kp; kp = kp->Next)
if (kp->Incolp) {
bool isdoc = !kp->Incolp->Array;
bool isdoc = !kp->Array;
if (isdoc)
BSON_APPEND_DOCUMENT_BEGIN(icp->Child, kp->Key, kp->Incolp->Child);
@@ -582,7 +661,7 @@ bool CMgoConn::DocWrite(PGLOBAL g, PINCOL icp)
} // end of DocWrite
/***********************************************************************/
/* WriteDB: Data Base write routine for DOS access method. */
/* WriteDB: Data Base write routine for CMGO access method. */
/***********************************************************************/
int CMgoConn::Write(PGLOBAL g)
{
@@ -590,22 +669,45 @@ int CMgoConn::Write(PGLOBAL g)
PTDB tp = Pcg->Tdbp;
if (tp->GetMode() == MODE_INSERT) {
Fpc->Init();
if (!Pcg->Line) {
Fpc->Init();
if (DocWrite(g, Fpc))
return RC_FX;
if (DocWrite(g, Fpc))
return RC_FX;
if (trace(2)) {
char *str = bson_as_json(Fpc->Child, NULL);
htrc("Inserting: %s\n", str);
bson_free(str);
} // endif trace
if (trace(2)) {
char* str = bson_as_json(Fpc->Child, NULL);
htrc("Inserting: %s\n", str);
bson_free(str);
} // endif trace
if (!mongoc_collection_insert(Collection, MONGOC_INSERT_NONE,
Fpc->Child, NULL, &Error)) {
sprintf(g->Message, "Mongo insert: %s", Error.message);
rc = RC_FX;
} // endif insert
if (!mongoc_collection_insert(Collection, MONGOC_INSERT_NONE,
Fpc->Child, NULL, &Error)) {
sprintf(g->Message, "Mongo insert: %s", Error.message);
rc = RC_FX;
} // endif insert
} else {
const uint8_t* val = (const uint8_t*)Pcg->Line;
bson_t* doc = bson_new_from_json(val, -1, &Error);
if (doc && trace(2)) {
char* str = bson_as_json(doc, NULL);
htrc("Inserting: %s\n", str);
bson_free(str);
} // endif trace
if (!doc) {
sprintf(g->Message, "bson_new_from_json: %s", Error.message);
rc = RC_FX;
} else if (!mongoc_collection_insert(Collection,
MONGOC_INSERT_NONE, doc, NULL, &Error)) {
sprintf(g->Message, "Mongo insert: %s", Error.message);
bson_destroy(doc);
rc = RC_FX;
} // endif insert
} // endif Line
} else {
bool b = false;
@@ -614,19 +716,26 @@ int CMgoConn::Write(PGLOBAL g)
bson_iter_init(&iter, Document);
if (bson_iter_find(&iter, "_id")) {
if (BSON_ITER_HOLDS_OID(&iter))
b = BSON_APPEND_OID(query, "_id", bson_iter_oid(&iter));
else if (BSON_ITER_HOLDS_INT32(&iter))
b = BSON_APPEND_INT32(query, "_id", bson_iter_int32(&iter));
else if (BSON_ITER_HOLDS_INT64(&iter))
b = BSON_APPEND_INT64(query, "_id", bson_iter_int64(&iter));
else if (BSON_ITER_HOLDS_DOUBLE(&iter))
b = BSON_APPEND_DOUBLE(query, "_id", bson_iter_double(&iter));
else if (BSON_ITER_HOLDS_UTF8(&iter))
b = BSON_APPEND_UTF8(query, "_id", bson_iter_utf8(&iter, NULL));
} // endif iter
if (bson_iter_find(&iter, "_id"))
switch (bson_iter_type(&iter)) {
case BSON_TYPE_OID:
b = BSON_APPEND_OID(query, "_id", bson_iter_oid(&iter));
break;
case BSON_TYPE_UTF8:
b = BSON_APPEND_UTF8(query, "_id", bson_iter_utf8(&iter, NULL));
break;
case BSON_TYPE_INT32:
b = BSON_APPEND_INT32(query, "_id", bson_iter_int32(&iter));
break;
case BSON_TYPE_INT64:
b = BSON_APPEND_INT64(query, "_id", bson_iter_int64(&iter));
break;
case BSON_TYPE_DOUBLE:
b = BSON_APPEND_DOUBLE(query, "_id", bson_iter_double(&iter));
break;
default:
break;
} // endswitch iter
if (b) {
if (trace(2)) {
@@ -708,8 +817,9 @@ void CMgoConn::Close(void)
if (Opts) bson_destroy(Opts);
if (Cursor) mongoc_cursor_destroy(Cursor);
if (Collection) mongoc_collection_destroy(Collection);
if (Client) mongoc_client_pool_push(Pool, Client);
if (Pool) mongoc_client_pool_destroy(Pool);
//if (Client) mongoc_client_pool_push(Pool, Client);
//if (Pool) mongoc_client_pool_destroy(Pool);
if (Client) mongoc_client_destroy(Client);
if (Uri) mongoc_uri_destroy(Uri);
if (Fpc) Fpc->Destroy();
if (fp) fp->Count = 0;
@@ -720,23 +830,51 @@ void CMgoConn::Close(void)
/***********************************************************************/
char *CMgoConn::Mini(PGLOBAL g, PCOL colp, const bson_t *bson, bool b)
{
char *s, *str = NULL;
char *Mbuf = (char*)PlugSubAlloc(g, NULL, colp->GetLength() + 1);
int i, k = 0;
bool ok = true;
char *s, *str = NULL;
char *Mbuf = (char*)PlugSubAlloc(g, NULL, (size_t)colp->GetLength() + 1);
int i, j = 0, k = 0, n = 0, m = GetDefaultPrec();
bool ok = true, dbl = false;
double d;
size_t len;
if (b)
s = str = bson_array_as_json(bson, NULL);
s = str = bson_array_as_json(bson, &len);
else
s = str = bson_as_json(bson, NULL);
s = str = bson_as_json(bson, &len);
if (len > (size_t)colp->GetLength()) {
sprintf(g->Message, "Value too long for column %s", colp->GetName());
bson_free(str);
throw (int)TYPE_AM_MGO;
} // endif len
for (i = 0; i < colp->GetLength() && s[i]; i++) {
switch (s[i]) {
case ' ':
if (ok) continue;
break;
case '"':
ok = !ok;
break;
case '.':
if (j) dbl = true;
break;
default:
if (ok) {
if (isdigit(s[i])) {
if (!j) j = k;
if (dbl) n++;
} else if (dbl && n > m) {
Mbuf[k] = 0;
d = atof(Mbuf + j);
n = sprintf(Mbuf + j, "%.*f", m, d);
k = j + n;
j = n = 0;
} else if (j)
j = n = 0;
} // endif ok
break;
} // endswitch s[i]
@@ -745,11 +883,6 @@ char *CMgoConn::Mini(PGLOBAL g, PCOL colp, const bson_t *bson, bool b)
bson_free(str);
if (i >= colp->GetLength()) {
sprintf(g->Message, "Value too long for column %s", colp->GetName());
throw (int)TYPE_AM_MGO;
} // endif i
Mbuf[k] = 0;
return Mbuf;
} // end of Mini
@@ -759,97 +892,103 @@ char *CMgoConn::Mini(PGLOBAL g, PCOL colp, const bson_t *bson, bool b)
/***********************************************************************/
void CMgoConn::GetColumnValue(PGLOBAL g, PCOL colp)
{
char *jpath = colp->GetJpath(g, false);
PVAL value = colp->GetValue();
char *jpath = colp->GetJpath(g, false);
bool b = false;
PVAL value = colp->GetValue();
bson_iter_t Iter; // Used to retrieve column value
bson_iter_t Desc; // Descendant iter
if (!strcmp(jpath, "*")) {
if (*jpath == '{')
jpath = colp->GetName(); // This is a Mongo defined column
if (!*jpath || !strcmp(jpath, "*")) {
value->SetValue_psz(Mini(g, colp, Document, false));
} else if (bson_iter_init(&Iter, Document) &&
bson_iter_find_descendant(&Iter, jpath, &Desc)) {
if (BSON_ITER_HOLDS_UTF8(&Desc))
value->SetValue_psz((PSZ)bson_iter_utf8(&Desc, NULL));
else if (BSON_ITER_HOLDS_INT32(&Desc))
value->SetValue(bson_iter_int32(&Desc));
else if (BSON_ITER_HOLDS_INT64(&Desc))
value->SetValue(bson_iter_int64(&Desc));
else if (BSON_ITER_HOLDS_DOUBLE(&Desc))
value->SetValue(bson_iter_double(&Desc));
else if (BSON_ITER_HOLDS_DATE_TIME(&Desc))
value->SetValue(bson_iter_date_time(&Desc) / 1000);
else if (BSON_ITER_HOLDS_BOOL(&Desc)) {
bool b = bson_iter_bool(&Desc);
switch (bson_iter_type(&Desc)) {
case BSON_TYPE_UTF8:
value->SetValue_psz((PSZ)bson_iter_utf8(&Desc, NULL));
break;
case BSON_TYPE_INT32:
value->SetValue(bson_iter_int32(&Desc));
break;
case BSON_TYPE_INT64:
value->SetValue(bson_iter_int64(&Desc));
break;
case BSON_TYPE_DOUBLE:
value->SetValue(bson_iter_double(&Desc));
break;
case BSON_TYPE_DATE_TIME:
value->SetValue(bson_iter_date_time(&Desc) / 1000);
break;
case BSON_TYPE_BOOL:
b = bson_iter_bool(&Desc);
if (value->IsTypeNum())
value->SetValue(b ? 1 : 0);
else
value->SetValue_psz(b ? "true" : "false");
if (value->IsTypeNum())
value->SetValue(b ? 1 : 0);
else
value->SetValue_psz(b ? "true" : "false");
} else if (BSON_ITER_HOLDS_OID(&Desc)) {
char str[25];
break;
case BSON_TYPE_OID: {
char str[25];
bson_oid_to_string(bson_iter_oid(&Desc), str);
value->SetValue_psz(str);
} else if (BSON_ITER_HOLDS_NULL(&Iter)) {
// Apparently this does not work...
value->Reset();
value->SetNull(true);
} else if (BSON_ITER_HOLDS_DECIMAL128(&Desc)) {
char *str = NULL;
bson_decimal128_t dec;
bson_oid_to_string(bson_iter_oid(&Desc), str);
value->SetValue_psz(str);
} break;
case BSON_TYPE_ARRAY:
b = true;
// passthru
case BSON_TYPE_DOCUMENT:
{ // All this because MongoDB can return the wrong type
int i = 0;
const uint8_t *data = NULL;
uint32_t len = 0;
bson_iter_decimal128(&Desc, &dec);
bson_decimal128_to_string(&dec, str);
value->SetValue_psz(str);
bson_free(str);
} else if (BSON_ITER_HOLDS_DOCUMENT(&Iter)) {
bson_t *doc;
const uint8_t *data = NULL;
uint32_t len = 0;
for (; i < 2; i++) {
if (b) // Try array first
bson_iter_array(&Desc, &len, &data);
else
bson_iter_document(&Desc, &len, &data);
bson_iter_document(&Desc, &len, &data);
if (!data) {
len = 0;
b = !b;
} else
break;
if (data) {
doc = bson_new_from_data(data, len);
value->SetValue_psz(Mini(g, colp, doc, false));
bson_destroy(doc);
} else {
// ... but we can come here in case of NULL!
value->Reset();
value->SetNull(true);
} // endif data
} else if (BSON_ITER_HOLDS_ARRAY(&Iter)) {
bson_t *arr;
const uint8_t *data = NULL;
uint32_t len = 0;
bson_iter_array(&Desc, &len, &data);
if (data) {
arr = bson_new_from_data(data, len);
value->SetValue_psz(Mini(g, colp, arr, true));
bson_destroy(arr);
} else {
// This is a bug in returning the wrong type
// This fix is only for document items
bson_t *doc;
bson_iter_document(&Desc, &len, &data);
} // endfor i
if (data) {
doc = bson_new_from_data(data, len);
value->SetValue_psz(Mini(g, colp, doc, false));
bson_t *doc = bson_new_from_data(data, len);
value->SetValue_psz(Mini(g, colp, doc, b));
bson_destroy(doc);
} else {
// ... or we can also come here in case of NULL!
value->Reset();
value->SetNull(true);
} // endif data
} // endif data
} // endif data
} break;
case BSON_TYPE_NULL:
// Apparently this does not work...
value->Reset();
value->SetNull(true);
break;
case BSON_TYPE_DECIMAL128: {
char str[BSON_DECIMAL128_STRING];
bson_decimal128_t dec;
} else
value->Reset();
bson_iter_decimal128(&Desc, &dec);
bson_decimal128_to_string(&dec, str);
value->SetValue_psz(str);
// bson_free(str);
} break;
default:
value->Reset();
break;
} // endswitch Desc
} else {
// Field does not exist
@@ -868,14 +1007,35 @@ bool CMgoConn::AddValue(PGLOBAL g, PCOL colp, bson_t *doc, char *key, bool upd)
PVAL value = colp->GetValue();
if (value->IsNull()) {
if (upd)
// if (upd)
rc = BSON_APPEND_NULL(doc, key);
else
return false;
// else
// return false;
} else switch (colp->GetResultType()) {
case TYPE_STRING:
rc = BSON_APPEND_UTF8(doc, key, value->GetCharValue());
if (colp->Stringify()) {
const uint8_t *val = (const uint8_t*)value->GetCharValue();
bson_t *bsn = bson_new_from_json(val, -1, &Error);
if (!bsn) {
sprintf (g->Message, "AddValue: %s", Error.message);
return true;
} else if (*key) {
if (*val == '[')
rc = BSON_APPEND_ARRAY(doc, key, bsn);
else
rc = BSON_APPEND_DOCUMENT(doc, key, bsn);
} else {
bson_copy_to (bsn, doc);
rc = true;
} // endif's
bson_free(bsn);
} else
rc = BSON_APPEND_UTF8(doc, key, value->GetCharValue());
break;
case TYPE_INT:
case TYPE_SHORT:

View File

@@ -28,11 +28,8 @@ typedef struct mongo_parms {
PCSZ Coll_name;
PCSZ Options;
PCSZ Filter;
PCSZ Line;
bool Pipe;
//PCSZ User; // User connect info
//PCSZ Pwd; // Password connect info
//int Fsize; // Fetch size
//bool Scrollable; // Scrollable cursor
} CMGOPARM, *PCPARM;
typedef struct KEYCOL {
@@ -40,15 +37,24 @@ typedef struct KEYCOL {
PINCOL Incolp;
PCOL Colp;
char *Key;
bool Array;
} *PKC;
typedef struct _path_list *PTHP;
typedef struct _path_list {
PSZ Path;
PSZ Name;
PTHP Next;
} PTH;
/***********************************************************************/
/* Used when inserting values in a MongoDB collection. */
/***********************************************************************/
class INCOL : public BLOCK {
public:
// Constructor
INCOL(bool ar) { Child = bson_new(); Klist = NULL; Array = ar; }
INCOL(void) { Child = bson_new(); Klist = NULL; }
// Methods
void AddCol(PGLOBAL g, PCOL colp, char *jp);
@@ -58,7 +64,6 @@ public:
//Members
bson_t *Child;
PKC Klist;
bool Array;
}; // end of INCOL;
/***********************************************************************/
@@ -80,6 +85,7 @@ public:
bool IsConnected(void) { return m_Connected; }
bool Connect(PGLOBAL g);
int CollSize(PGLOBAL g);
void CMgoConn::Project(PGLOBAL g, PSTRG s);
bool MakeCursor(PGLOBAL g);
int ReadNext(PGLOBAL g);
PSZ GetDocument(PGLOBAL g);
@@ -99,7 +105,7 @@ protected:
// Members
PCPARM Pcg;
mongoc_uri_t *Uri;
mongoc_client_pool_t *Pool; // Thread safe client pool
//mongoc_client_pool_t *Pool; // Thread safe client pool
mongoc_client_t *Client; // The MongoDB client
mongoc_database_t *Database; // The MongoDB database
mongoc_collection_t *Collection; // The MongoDB collection
@@ -108,8 +114,6 @@ protected:
bson_t *Query; // MongoDB cursor filter
bson_t *Opts; // MongoDB cursor options
bson_error_t Error;
bson_iter_t Iter; // Used to retrieve column value
bson_iter_t Desc; // Descendant iter
PINCOL Fpc; // To insert INCOL classes
PFBLOCK fp;
bool m_Connected;

View File

@@ -298,9 +298,9 @@ FIDBLK::FIDBLK(PCOLUMN cp, OPVAL op) : SPCBLK(cp), Op(op)
Buf_Type = TYPE_STRING;
*Format.Type = 'C';
Format.Length = Long;
#if defined(__WIN__)
#if defined(_WIN32)
Format.Prec = 1; // Case insensitive
#endif // __WIN__
#endif // _WIN32
Constant = (!To_Tdb->GetDef()->GetMultiple() &&
To_Tdb->GetAmType() != TYPE_AM_PLG &&
To_Tdb->GetAmType() != TYPE_AM_PLM);

View File

@@ -38,7 +38,8 @@ class DllExport COLBLK : public XOBJECT {
virtual PTDB GetTo_Tdb(void) {return To_Tdb;}
virtual int GetClustered(void) {return 0;}
virtual int IsClustered(void) {return FALSE;}
virtual PSZ GetJpath(PGLOBAL g, bool proj) {return NULL;}
virtual bool Stringify(void) {return FALSE;}
virtual PSZ GetJpath(PGLOBAL g, bool proj) {return NULL;}
PCOL GetNext(void) {return Next;}
PSZ GetName(void) {return Name;}
int GetIndex(void) {return Index;}

View File

@@ -4,7 +4,7 @@
/******************************************************************/
#include "my_global.h"
#include <stdio.h>
#if defined(__WIN__)
#if defined(_WIN32)
//#include <windows.h>
#if defined(MSX2)
#import "msxml2.dll" //Does not exist on Vista

View File

@@ -17,12 +17,12 @@
/* Include relevant sections of the System header files. */
/***********************************************************************/
#include "my_global.h"
#if defined(__WIN__)
#if defined(_WIN32)
#if defined(__BORLANDC__)
#define __MFC_COMPAT__ // To define min/max as macro
#endif // __BORLANDC__
//#include <windows.h>
#else // !__WIN__
#else // !_WIN32
#if defined(UNIX)
#include <errno.h>
#include <unistd.h>
@@ -30,7 +30,7 @@
#include <io.h>
#endif // !UNIX
#include <fcntl.h>
#endif // !__WIN__
#endif // !_WIN32
/***********************************************************************/
/* Include application header files: */
@@ -197,11 +197,11 @@ bool MAPFAM::OpenTableFile(PGLOBAL g)
return true;
} // endif Memory
#if defined(__WIN__)
#if defined(_WIN32)
if (mode != MODE_DELETE) {
#else // !__WIN__
#else // !_WIN32
if (mode == MODE_READ) {
#endif // !__WIN__
#endif // !_WIN32
CloseFileHandle(hFile); // Not used anymore
hFile = INVALID_HANDLE_VALUE; // For Fblock
} // endif Mode
@@ -468,7 +468,7 @@ int MAPFAM::DeleteRecords(PGLOBAL g, int irc)
/*****************************************************************/
n = (int)(Tpos - Memory);
#if defined(__WIN__)
#if defined(_WIN32)
DWORD drc = SetFilePointer(fp->Handle, n, NULL, FILE_BEGIN);
if (drc == 0xFFFFFFFF) {
@@ -498,7 +498,7 @@ int MAPFAM::DeleteRecords(PGLOBAL g, int irc)
#endif // UNIX
} // endif Abort
#if defined(__WIN__)
#if defined(_WIN32)
CloseHandle(fp->Handle);
#else // UNIX
close(fp->Handle);

View File

@@ -22,12 +22,12 @@
/* Include relevant sections of the System header files. */
/***********************************************************************/
#include "my_global.h"
#if defined(__WIN__)
#if defined(_WIN32)
#include <io.h>
#include <fcntl.h>
//#include <errno.h>
//#include <windows.h>
#else // !__WIN__
#else // !_WIN32
#if defined(UNIX)
#include <errno.h>
#include <unistd.h>
@@ -35,7 +35,7 @@
//#include <io.h>
#endif // !UNIX
//#include <fcntl.h>
#endif // !__WIN__
#endif // !_WIN32
#include <ctype.h>
#include <stdio.h>
#include <string.h>
@@ -649,7 +649,7 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g)
To_Buf = (char*)PlugSubAlloc(g, NULL, Buflen);
if (mode == MODE_INSERT) {
#if defined(__WIN__)
#if defined(_WIN32)
/************************************************************************/
/* Now we can revert to binary mode in particular because the eventual */
/* writing of a new header must be done in binary mode to avoid */
@@ -659,7 +659,7 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g)
sprintf(g->Message, MSG(BIN_MODE_FAIL), strerror(errno));
return true;
} // endif setmode
#endif // __WIN__
#endif // _WIN32
/************************************************************************/
/* If this is a new file, the header must be generated. */

View File

@@ -17,7 +17,7 @@
/* Include relevant sections of the System header files. */
/***********************************************************************/
#include "my_global.h"
#if defined(__WIN__)
#if defined(_WIN32)
#include <io.h>
#include <fcntl.h>
#include <errno.h>
@@ -25,7 +25,7 @@
#define __MFC_COMPAT__ // To define min/max as macro
#endif // __BORLANDC__
//#include <windows.h>
#else // !__WIN__
#else // !_WIN32
#if defined(UNIX)
#include <errno.h>
#include <unistd.h>
@@ -34,7 +34,7 @@
#endif // !UNIX
#include <sys/stat.h>
#include <fcntl.h>
#endif // !__WIN__
#endif // !_WIN32
/***********************************************************************/
/* Include application header files: */
@@ -338,7 +338,7 @@ int FIXFAM::ReadBuffer(PGLOBAL g)
} else if (feof(Stream)) {
rc = RC_EF;
} else {
#if defined(__WIN__)
#if defined(_WIN32)
sprintf(g->Message, MSG(READ_ERROR), To_File, _strerror(NULL));
#else
sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(errno));
@@ -678,7 +678,7 @@ BGXFAM::BGXFAM(PBGXFAM txfp) : FIXFAM(txfp)
/***********************************************************************/
bool BGXFAM::BigSeek(PGLOBAL g, HANDLE h, BIGINT pos, int org)
{
#if defined(__WIN__)
#if defined(_WIN32)
char buf[256];
DWORD drc;
LARGE_INTEGER of;
@@ -694,14 +694,14 @@ bool BGXFAM::BigSeek(PGLOBAL g, HANDLE h, BIGINT pos, int org)
sprintf(g->Message, MSG(SFP_ERROR), buf);
return true;
} // endif
#else // !__WIN__
#else // !_WIN32
if (lseek64(h, pos, org) < 0) {
// sprintf(g->Message, MSG(ERROR_IN_LSK), errno);
sprintf(g->Message, "lseek64: %s", strerror(errno));
printf("%s\n", g->Message);
return true;
} // endif
#endif // !__WIN__
#endif // !_WIN32
return false;
} // end of BigSeek
@@ -714,7 +714,7 @@ int BGXFAM::BigRead(PGLOBAL g __attribute__((unused)),
{
int rc;
#if defined(__WIN__)
#if defined(_WIN32)
DWORD nbr, drc, len = (DWORD)req;
bool brc = ReadFile(h, inbuf, len, &nbr, NULL);
@@ -736,12 +736,12 @@ int BGXFAM::BigRead(PGLOBAL g __attribute__((unused)),
rc = -1;
} else
rc = (int)nbr;
#else // !__WIN__
#else // !_WIN32
size_t len = (size_t)req;
ssize_t nbr = read(h, inbuf, len);
rc = (int)nbr;
#endif // !__WIN__
#endif // !_WIN32
return rc;
} // end of BigRead
@@ -753,7 +753,7 @@ bool BGXFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req)
{
bool rc = false;
#if defined(__WIN__)
#if defined(_WIN32)
DWORD nbw, drc, len = (DWORD)req;
bool brc = WriteFile(h, inbuf, len, &nbw, NULL);
@@ -781,7 +781,7 @@ bool BGXFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req)
rc = true;
} // endif brc || nbw
#else // !__WIN__
#else // !_WIN32
size_t len = (size_t)req;
ssize_t nbw = write(h, inbuf, len);
@@ -796,7 +796,7 @@ bool BGXFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req)
rc = true;
} // endif nbr
#endif // !__WIN__
#endif // !_WIN32
return rc;
} // end of BigWrite
@@ -831,7 +831,7 @@ bool BGXFAM::OpenTableFile(PGLOBAL g)
if (trace(1))
htrc("OpenTableFile: filename=%s mode=%d\n", filename, mode);
#if defined(__WIN__)
#if defined(_WIN32)
DWORD rc, access, creation, share = 0;
/*********************************************************************/
@@ -989,7 +989,7 @@ int BGXFAM::Cardinality(PGLOBAL g)
PlugSetPath(filename, To_File, Tdbp->GetPath());
#if defined(__WIN__) // OB
#if defined(_WIN32) // OB
LARGE_INTEGER len;
DWORD rc = 0;
@@ -1348,7 +1348,7 @@ int BGXFAM::DeleteRecords(PGLOBAL g, int irc)
/*****************************************************************/
/* Remove extra records. */
/*****************************************************************/
#if defined(__WIN__)
#if defined(_WIN32)
if (BigSeek(g, Hfile, (BIGINT)Tpos * (BIGINT)Lrecl))
return RC_FX;
@@ -1358,12 +1358,12 @@ int BGXFAM::DeleteRecords(PGLOBAL g, int irc)
sprintf(g->Message, MSG(SETEOF_ERROR), drc);
return RC_FX;
} // endif error
#else // !__WIN__
#else // !_WIN32
if (ftruncate64(Hfile, (BIGINT)(Tpos * Lrecl))) {
sprintf(g->Message, MSG(TRUNCATE_ERROR), strerror(errno));
return RC_FX;
} // endif
#endif // !__WIN__
#endif // !_WIN32
} // endif UseTemp
@@ -1388,7 +1388,7 @@ bool BGXFAM::OpenTempFile(PGLOBAL g)
strcat(PlugRemoveType(tempname, tempname), ".t");
remove(tempname); // Be sure it does not exist yet
#if defined(__WIN__)
#if defined(_WIN32)
Tfile = CreateFile(tempname, GENERIC_WRITE, 0, NULL,
CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
@@ -1528,7 +1528,7 @@ void BGXFAM::CloseTableFile(PGLOBAL g, bool abort)
void BGXFAM::Rewind(void)
{
#if 0 // This is probably unuseful because file is accessed directly
#if defined(__WIN__) //OB
#if defined(_WIN32) //OB
SetFilePointer(Hfile, 0, NULL, FILE_BEGIN);
#else // UNIX
lseek64(Hfile, 0, SEEK_SET);

View File

@@ -17,21 +17,21 @@
/* Include relevant MariaDB header file. */
/***********************************************************************/
#include "my_global.h"
#if defined(__WIN__)
#if defined(_WIN32)
#include <io.h>
#include <fcntl.h>
#if defined(__BORLANDC__)
#define __MFC_COMPAT__ // To define min/max as macro
#endif
//#include <windows.h>
#else // !__WIN__
#else // !_WIN32
#if defined(UNIX)
#include <errno.h>
#else // !UNIX
#include <io.h>
#endif
#include <fcntl.h>
#endif // !__WIN__
#endif // !_WIN32
/***********************************************************************/
/* Include application header files: */
@@ -89,11 +89,11 @@ int GZFAM::Zerror(PGLOBAL g)
strcpy(g->Message, gzerror(Zfile, &errnum));
if (errnum == Z_ERRNO)
#if defined(__WIN__)
#if defined(_WIN32)
sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(NULL));
#else // !__WIN__
#else // !_WIN32
sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(errno));
#endif // !__WIN__
#endif // !_WIN32
return (errnum == Z_STREAM_END) ? RC_EF : RC_FX;
} // end of Zerror
@@ -764,9 +764,9 @@ bool GZXFAM::AllocateBuffer(PGLOBAL g)
if (Tdbp->GetFtype() < 2)
// if not binary, the file is physically a text file
for (int len = Lrecl; len <= Buflen; len += Lrecl) {
#if defined(__WIN__)
#if defined(_WIN32)
To_Buf[len - 2] = '\r';
#endif // __WIN__
#endif // _WIN32
To_Buf[len - 1] = '\n';
} // endfor len

View File

@@ -17,7 +17,7 @@
/* Include relevant sections of the System header files. */
/***********************************************************************/
#include "my_global.h"
#if defined(__WIN__)
#if defined(_WIN32)
#include <io.h>
#include <fcntl.h>
#include <errno.h>
@@ -25,7 +25,7 @@
#define __MFC_COMPAT__ // To define min/max as macro
#endif // __BORLANDC__
//#include <windows.h>
#else // !__WIN__
#else // !_WIN32
#if defined(UNIX) || defined(UNIV_LINUX)
#include <errno.h>
#include <unistd.h>
@@ -36,7 +36,7 @@
#include <io.h>
#endif // !UNIX
#include <fcntl.h>
#endif // !__WIN__
#endif // !_WIN32
/***********************************************************************/
/* Include application header files: */
@@ -82,7 +82,7 @@ TXTFAM::TXTFAM(PDOSDEF tdp)
To_File = NULL;
Lrecl = 0;
Eof = false;
#if defined(__WIN__)
#if defined(_WIN32)
Ending = 2;
#else
Ending = 1;
@@ -731,7 +731,7 @@ int DOSFAM::SkipRecord(PGLOBAL g, bool header)
if (feof(Stream))
return RC_EF;
#if defined(__WIN__)
#if defined(_WIN32)
sprintf(g->Message, MSG(READ_ERROR), To_File, _strerror(NULL));
#else
sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(0));
@@ -814,7 +814,7 @@ int DOSFAM::ReadBuffer(PGLOBAL g)
if (trace(2))
htrc(" Read: To_Buf=%p p=%c\n", To_Buf, p);
#if defined(__WIN__)
#if defined(_WIN32)
if (Bin) {
// Data file is read in binary so CRLF remains
#else
@@ -848,7 +848,7 @@ int DOSFAM::ReadBuffer(PGLOBAL g)
} else if (feof(Stream)) {
rc = RC_EF;
} else {
#if defined(__WIN__)
#if defined(_WIN32)
sprintf(g->Message, MSG(READ_ERROR), To_File, _strerror(NULL));
#else
sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(0));
@@ -1043,7 +1043,7 @@ int DOSFAM::DeleteRecords(PGLOBAL g, int irc)
/*****************************************************************/
/* Remove extra records. */
/*****************************************************************/
#if defined(__WIN__)
#if defined(_WIN32)
if (chsize(h, Tpos)) {
sprintf(g->Message, MSG(CHSIZE_ERROR), strerror(errno));
close(h);
@@ -1482,7 +1482,7 @@ int BLKFAM::ReadBuffer(PGLOBAL g)
} else if (feof(Stream)) {
rc = RC_EF;
} else {
#if defined(__WIN__)
#if defined(_WIN32)
sprintf(g->Message, MSG(READ_ERROR), To_File, _strerror(NULL));
#else
sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(errno));
@@ -1567,11 +1567,11 @@ int BLKFAM::WriteBuffer(PGLOBAL g)
Spos = GetNextPos(); // New start position
// Prepare the output buffer
#if defined(__WIN__)
#if defined(_WIN32)
crlf = "\r\n";
#else
crlf = "\n";
#endif // __WIN__
#endif // _WIN32
strcat(strcpy(OutBuf, Tdbp->GetLine()), crlf);
len = strlen(OutBuf);
} else {
@@ -1871,7 +1871,7 @@ int BINFAM::ReadBuffer(PGLOBAL g)
} else if (feof(Stream)) {
rc = RC_EF;
} else {
#if defined(__WIN__)
#if defined(_WIN32)
sprintf(g->Message, MSG(READ_ERROR), To_File, _strerror(NULL));
#else
sprintf(g->Message, MSG(READ_ERROR), To_File, strerror(0));
@@ -2065,7 +2065,7 @@ int DOSFAM::DeleteRecords(PGLOBAL g, int irc)
/*****************************************************************/
/* Remove extra records. */
/*****************************************************************/
#if defined(__WIN__)
#if defined(_WIN32)
if (chsize(h, Tpos)) {
sprintf(g->Message, MSG(CHSIZE_ERROR), strerror(errno));
close(h);

View File

@@ -21,7 +21,7 @@
/* Include relevant MariaDB header file. */
/***********************************************************************/
#include "my_global.h"
#if defined(__WIN__)
#if defined(_WIN32)
#include <io.h>
#include <fcntl.h>
#if defined(__BORLANDC__)
@@ -29,7 +29,7 @@
#endif // __BORLAND__
//#include <windows.h>
#include <sys/stat.h>
#else // !__WIN__
#else // !_WIN32
#if defined(UNIX)
#include <sys/types.h>
#include <sys/stat.h>
@@ -40,7 +40,7 @@
#include <io.h>
#endif // !UNIX
#include <fcntl.h>
#endif // !__WIN__
#endif // !_WIN32
/***********************************************************************/
/* Include application header files: */
@@ -371,11 +371,11 @@ bool VCTFAM::MakeEmptyFile(PGLOBAL g, PCSZ fn)
int h, n;
PlugSetPath(filename, fn, Tdbp->GetPath());
#if defined(__WIN__)
#if defined(_WIN32)
h= global_open(g, MSGID_OPEN_EMPTY_FILE, filename, _O_CREAT | _O_WRONLY, S_IREAD | S_IWRITE);
#else // !__WIN__
#else // !_WIN32
h= global_open(g, MSGID_OPEN_EMPTY_FILE, filename, O_CREAT | O_WRONLY, S_IREAD | S_IWRITE);
#endif // !__WIN__
#endif // !_WIN32
if (h == -1)
return true;
@@ -1672,7 +1672,7 @@ int VCMFAM::DeleteRecords(PGLOBAL g, int irc)
// Remove extra blocks
n = Block * Blksize;
#if defined(__WIN__)
#if defined(_WIN32)
DWORD drc = SetFilePointer(fp->Handle, n, NULL, FILE_BEGIN);
if (drc == 0xFFFFFFFF) {
@@ -2579,11 +2579,11 @@ bool VECFAM::ReadBlock(PGLOBAL g, PVCTCOL colp)
char fn[_MAX_PATH];
sprintf(fn, Colfn, colp->Index);
#if defined(__WIN__)
#if defined(_WIN32)
if (feof(Streams[i]))
#else // !__WIN__
#else // !_WIN32
if (errno == NO_ERROR)
#endif // !__WIN__
#endif // !_WIN32
sprintf(g->Message, MSG(BAD_READ_NUMBER), (int) n, fn);
else
sprintf(g->Message, MSG(READ_ERROR),
@@ -2979,7 +2979,7 @@ int VMPFAM::DeleteRecords(PGLOBAL g, int irc)
/*****************************************************************/
n = Tpos * Clens[i];
#if defined(__WIN__)
#if defined(_WIN32)
DWORD drc = SetFilePointer(fp->Handle, n, NULL, FILE_BEGIN);
if (drc == 0xFFFFFFFF) {
@@ -3059,7 +3059,7 @@ BGVFAM::BGVFAM(PBGVFAM txfp) : VCTFAM(txfp)
/***********************************************************************/
bool BGVFAM::BigSeek(PGLOBAL g, HANDLE h, BIGINT pos, bool b)
{
#if defined(__WIN__)
#if defined(_WIN32)
char buf[256];
DWORD drc, m = (b) ? FILE_END : FILE_BEGIN;
LARGE_INTEGER of;
@@ -3075,12 +3075,12 @@ bool BGVFAM::BigSeek(PGLOBAL g, HANDLE h, BIGINT pos, bool b)
sprintf(g->Message, MSG(SFP_ERROR), buf);
return true;
} // endif
#else // !__WIN__
#else // !_WIN32
if (lseek64(h, pos, (b) ? SEEK_END : SEEK_SET) < 0) {
sprintf(g->Message, MSG(ERROR_IN_LSK), errno);
return true;
} // endif
#endif // !__WIN__
#endif // !_WIN32
return false;
} // end of BigSeek
@@ -3092,7 +3092,7 @@ bool BGVFAM::BigRead(PGLOBAL g, HANDLE h, void *inbuf, int req)
{
bool rc = false;
#if defined(__WIN__)
#if defined(_WIN32)
DWORD nbr, drc, len = (DWORD)req;
bool brc = ReadFile(h, inbuf, len, &nbr, NULL);
@@ -3118,7 +3118,7 @@ bool BGVFAM::BigRead(PGLOBAL g, HANDLE h, void *inbuf, int req)
rc = true;
} // endif brc || nbr
#else // !__WIN__
#else // !_WIN32
size_t len = (size_t)req;
ssize_t nbr = read(h, inbuf, len);
@@ -3133,7 +3133,7 @@ bool BGVFAM::BigRead(PGLOBAL g, HANDLE h, void *inbuf, int req)
rc = true;
} // endif nbr
#endif // !__WIN__
#endif // !_WIN32
return rc;
} // end of BigRead
@@ -3145,7 +3145,7 @@ bool BGVFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req)
{
bool rc = false;
#if defined(__WIN__)
#if defined(_WIN32)
DWORD nbw, drc, len = (DWORD)req;
bool brc = WriteFile(h, inbuf, len, &nbw, NULL);
@@ -3173,7 +3173,7 @@ bool BGVFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req)
rc = true;
} // endif brc || nbw
#else // !__WIN__
#else // !_WIN32
size_t len = (size_t)req;
ssize_t nbw = write(h, inbuf, len);
@@ -3188,7 +3188,7 @@ bool BGVFAM::BigWrite(PGLOBAL g, HANDLE h, void *inbuf, int req)
rc = true;
} // endif nbr
#endif // !__WIN__
#endif // !_WIN32
return rc;
} // end of BigWrite
@@ -3214,7 +3214,7 @@ int BGVFAM::GetBlockInfo(PGLOBAL g)
if (Header == 2)
strcat(PlugRemoveType(filename, filename), ".blk");
#if defined(__WIN__)
#if defined(_WIN32)
LARGE_INTEGER len;
h = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL,
@@ -3226,11 +3226,11 @@ int BGVFAM::GetBlockInfo(PGLOBAL g)
} // endif h
if (h == INVALID_HANDLE_VALUE || !len.QuadPart) {
#else // !__WIN__
#else // !_WIN32
h = open64(filename, O_RDONLY, 0);
if (h == INVALID_HANDLE_VALUE || !_filelength(h)) {
#endif // !__WIN__
#endif // !_WIN32
// Consider this is a void table
if (trace(1))
htrc("Void table h=%d\n", h);
@@ -3291,17 +3291,17 @@ bool BGVFAM::SetBlockInfo(PGLOBAL g)
strcat(PlugRemoveType(filename, filename), ".blk");
if (h == INVALID_HANDLE_VALUE) {
#if defined(__WIN__)
#if defined(_WIN32)
DWORD creation = (b) ? OPEN_EXISTING : TRUNCATE_EXISTING;
h = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, 0,
NULL, creation, FILE_ATTRIBUTE_NORMAL, NULL);
#else // !__WIN__
#else // !_WIN32
int oflag = (b) ? O_RDWR : O_RDWR | O_TRUNC;
h = open64(filename, oflag, 0);
#endif // !__WIN__
#endif // !_WIN32
if (h == INVALID_HANDLE_VALUE) {
sprintf(g->Message, "Error opening header file %s", filename);
@@ -3339,7 +3339,7 @@ bool BGVFAM::MakeEmptyFile(PGLOBAL g, PCSZ fn)
PlugSetPath(filename, fn, Tdbp->GetPath());
#if defined(__WIN__)
#if defined(_WIN32)
PCSZ p;
DWORD rc;
bool brc;
@@ -3391,7 +3391,7 @@ bool BGVFAM::MakeEmptyFile(PGLOBAL g, PCSZ fn)
CloseHandle(h);
return true;
#else // !__WIN__
#else // !_WIN32
int h;
BIGINT pos;
@@ -3420,7 +3420,7 @@ bool BGVFAM::MakeEmptyFile(PGLOBAL g, PCSZ fn)
sprintf(g->Message, MSG(MAKE_EMPTY_FILE), To_File, strerror(errno));
close(h);
return true;
#endif // !__WIN__
#endif // !_WIN32
} // end of MakeEmptyFile
/***********************************************************************/
@@ -3451,7 +3451,7 @@ bool BGVFAM::OpenTableFile(PGLOBAL g)
htrc("OpenTableFile: filename=%s mode=%d Last=%d\n",
filename, mode, Last);
#if defined(__WIN__)
#if defined(_WIN32)
DWORD access, creation, share = 0, rc = 0;
/*********************************************************************/
@@ -3779,7 +3779,7 @@ int BGVFAM::WriteBuffer(PGLOBAL g)
if (!Closing && !MaxBlk) {
// Close the VCT file and reopen it in mode Insert
//#if defined(__WIN__) //OB
//#if defined(_WIN32) //OB
// CloseHandle(Hfile);
//#else // UNIX
// close(Hfile);
@@ -3906,7 +3906,7 @@ int BGVFAM::DeleteRecords(PGLOBAL g, int irc)
/***************************************************************/
/* Remove extra records. */
/***************************************************************/
#if defined(__WIN__)
#if defined(_WIN32)
BIGINT pos = (BIGINT)Block * (BIGINT)Blksize;
if (BigSeek(g, Hfile, pos))
@@ -3918,12 +3918,12 @@ int BGVFAM::DeleteRecords(PGLOBAL g, int irc)
sprintf(g->Message, MSG(SETEOF_ERROR), drc);
return RC_FX;
} // endif error
#else // !__WIN__
#else // !_WIN32
if (ftruncate64(Hfile, (BIGINT)(Tpos * Lrecl))) {
sprintf(g->Message, MSG(TRUNCATE_ERROR), strerror(errno));
return RC_FX;
} // endif
#endif // !__WIN__
#endif // !_WIN32
} else // MaxBlk
// Clean the unused space in the file, this is required when
// inserting again with a partial column list.
@@ -3960,7 +3960,7 @@ bool BGVFAM::OpenTempFile(PGLOBAL g)
else if (MakeEmptyFile(g, tempname))
return true;
#if defined(__WIN__)
#if defined(_WIN32)
DWORD access = (MaxBlk) ? OPEN_EXISTING : CREATE_NEW;
Tfile = CreateFile(tempname, GENERIC_WRITE, 0, NULL,
@@ -4231,7 +4231,7 @@ void BGVFAM::Rewind(void)
CurNum = Nrec - 1;
#if 0 // This is probably unuseful as the file is directly accessed
#if defined(__WIN__) //OB
#if defined(_WIN32) //OB
SetFilePointer(Hfile, 0, NULL, FILE_BEGIN);
#else // UNIX
lseek64(Hfile, 0, SEEK_SET);

View File

@@ -17,7 +17,7 @@
/* Include relevant sections of the System header files. */
/***********************************************************************/
#include "my_global.h"
#if !defined(__WIN__)
#if !defined(_WIN32)
#if defined(UNIX)
#include <fnmatch.h>
#include <errno.h>
@@ -27,7 +27,7 @@
#include <io.h>
#endif // !UNIX
#include <fcntl.h>
#endif // !__WIN__
#endif // !_WIN32
#include <time.h>
/***********************************************************************/
@@ -153,7 +153,7 @@ static bool ZipFiles(PGLOBAL g, ZIPUTIL *zutp, PCSZ pat, char *buf)
/*********************************************************************/
strcpy(filename, pat);
#if defined(__WIN__)
#if defined(_WIN32)
int rc;
char drive[_MAX_DRIVE], direc[_MAX_DIR];
WIN32_FIND_DATA FileData;
@@ -210,7 +210,7 @@ static bool ZipFiles(PGLOBAL g, ZIPUTIL *zutp, PCSZ pat, char *buf)
return true;
} // endif FindClose
#else // !__WIN__
#else // !_WIN32
struct stat fileinfo;
char fn[FN_REFLEN], direc[FN_REFLEN], pattern[FN_HEADLEN], ftype[FN_EXTLEN];
DIR *dir;
@@ -251,7 +251,7 @@ static bool ZipFiles(PGLOBAL g, ZIPUTIL *zutp, PCSZ pat, char *buf)
// Close the dir handle.
closedir(dir);
#endif // !__WIN__
#endif // !_WIN32
return false;
} // end of ZipFiles
@@ -275,9 +275,9 @@ bool ZipLoadFile(PGLOBAL g, PCSZ zfn, PCSZ fn, PCSZ entry, bool append, bool mul
if (!entry) { // entry defaults to the file name
char* p = strrchr((char*)fn, '/');
#if defined(__WIN__)
#if defined(_WIN32)
if (!p) p = strrchr((char*)fn, '\\');
#endif // __WIN__
#endif // _WIN32
entp = (p) ? p + 1 : entry;
} else
entp = entry;
@@ -467,7 +467,7 @@ UNZIPUTL::UNZIPUTL(PCSZ tgt, PCSZ pw, bool mul)
memset(fn, 0, sizeof(fn));
// Init the case mapping table.
#if defined(__WIN__)
#if defined(_WIN32)
for (int i = 0; i < 256; ++i) mapCaseTable[i] = toupper(i);
#else
for (int i = 0; i < 256; ++i) mapCaseTable[i] = i;
@@ -487,7 +487,7 @@ UNZIPUTL::UNZIPUTL(PDOSDEF tdp)
memset(fn, 0, sizeof(fn));
// Init the case mapping table.
#if defined(__WIN__)
#if defined(_WIN32)
for (int i = 0; i < 256; ++i) mapCaseTable[i] = toupper(i);
#else
for (int i = 0; i < 256; ++i) mapCaseTable[i] = i;

View File

@@ -13,13 +13,13 @@
//#include "sql_class.h"
//#include "sql_time.h"
#if defined(__WIN__)
#if defined(_WIN32)
//#include <windows.h>
#else // !__WIN__
#else // !_WIN32
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#endif // !__WIN__
#endif // !_WIN32
/***********************************************************************/

View File

@@ -106,7 +106,7 @@ class FILTERX : public FILTER {
// Fake operator new used to change a filter into a derived filter
void * operator new(size_t, PFIL filp) {return filp;}
#if defined(__WIN__)
#if defined(_WIN32)
// Avoid warning C4291 by defining a matching dummy delete operator
void operator delete(void *, PFIL) {}
#else

View File

@@ -22,12 +22,12 @@
*/
#define FLEX_SCANNER
#ifdef __WIN__
#ifdef _WIN32
#define __STDC__ 1
#define isatty _isatty
#endif
#include <stdio.h>
#ifndef __WIN__
#ifndef _WIN32
#include <unistd.h>
#endif

View File

@@ -14,11 +14,11 @@
#include <time.h> /* time_t type declaration */
#include <setjmp.h> /* Long jump declarations */
#if defined(__WIN__) && !defined(NOEX)
#if defined(_WIN32) && !defined(NOEX)
#define DllExport __declspec( dllexport )
#else // !__WIN__
#else // !_WIN32
#define DllExport
#endif // !__WIN__
#endif // !_WIN32
#if defined(DOMDOC_SUPPORT) || defined(LIBXML2_SUPPORT)
#define XML_SUPPORT 1
@@ -43,11 +43,11 @@
#define STEP(I) MSG_##I
#endif // !XMSG and !NEWMSG
#if defined(__WIN__)
#if defined(_WIN32)
#define CRLF 2
#else // !__WIN__
#else // !_WIN32
#define CRLF 1
#endif // !__WIN__
#endif // !_WIN32
/***********************************************************************/
/* Define access to the thread based trace value. */
@@ -204,9 +204,9 @@ DllExport char *PlugReadMessage(PGLOBAL, int, char *);
#elif defined(NEWMSG)
DllExport char *PlugGetMessage(PGLOBAL, int);
#endif // XMSG || NEWMSG
#if defined(__WIN__)
#if defined(_WIN32)
DllExport short GetLineLength(PGLOBAL); // Console line length
#endif // __WIN__
#endif // _WIN32
DllExport PGLOBAL PlugInit(LPCSTR, size_t); // Plug global initialization
DllExport PGLOBAL PlugExit(PGLOBAL); // Plug global termination
DllExport LPSTR PlugRemoveType(LPSTR, LPCSTR);

View File

@@ -139,10 +139,10 @@
//#include "reldef.h"
#include "tabcol.h"
#include "xindex.h"
#if defined(__WIN__)
#if defined(_WIN32)
#include <io.h>
#include "tabwmi.h"
#endif // __WIN__
#endif // _WIN32
#include "connect.h"
#include "user_connect.h"
#include "ha_connect.h"
@@ -167,16 +167,16 @@
#define SZCONV 1024 // Default converted text size
#define SZWORK 67108864 // Default work area size 64M
#define SZWMIN 4194304 // Minimum work area size 4M
#define JSONMAX 10 // JSON Default max grp size
#define JSONMAX 50 // JSON Default max grp size
extern "C" {
char version[]= "Version 1.07.0002 March 22, 2021";
#if defined(__WIN__)
char compver[]= "Version 1.07.0002 " __DATE__ " " __TIME__;
char version[]= "Version 1.07.0003 June 06, 2021";
#if defined(_WIN32)
char compver[]= "Version 1.07.0003 " __DATE__ " " __TIME__;
char slash= '\\';
#else // !__WIN__
#else // !_WIN32
char slash= '/';
#endif // !__WIN__
#endif // !_WIN32
} // extern "C"
#if MYSQL_VERSION_ID > 100200
@@ -288,10 +288,14 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
/****************************************************************************/
static char *strz(PGLOBAL g, LEX_CSTRING &ls)
{
char *str= (char*)PlugSubAlloc(g, NULL, ls.length + 1);
char* str= NULL;
if (ls.str) {
str= (char*)PlugSubAlloc(g, NULL, ls.length + 1);
memcpy(str, ls.str, ls.length);
str[ls.length] = 0;
} // endif str
memcpy(str, ls.str, ls.length);
str[ls.length]= 0;
return str;
} // end of strz
@@ -506,7 +510,7 @@ char *GetJsonNull(void)
int GetDefaultDepth(void) {return THDVAR(current_thd, default_depth);}
int GetDefaultPrec(void) {return THDVAR(current_thd, default_prec);}
uint GetJsonGrpSize(void)
{return connect_hton ? THDVAR(current_thd, json_grp_size) : 10;}
{return connect_hton ? THDVAR(current_thd, json_grp_size) : 50;}
size_t GetWorkSize(void) {return (size_t)THDVAR(current_thd, work_size);}
void SetWorkSize(size_t)
{
@@ -800,11 +804,11 @@ static int connect_init_func(void *p)
}
#endif // 0 (LINUX)
#if defined(__WIN__)
#if defined(_WIN32)
sql_print_information("CONNECT: %s", compver);
#else // !__WIN__
#else // !_WIN32
sql_print_information("CONNECT: %s", version);
#endif // !__WIN__
#endif // !_WIN32
pthread_mutex_init(&parmut, NULL);
pthread_mutex_init(&usrmut, NULL);
pthread_mutex_init(&tblmut, NULL);
@@ -863,9 +867,9 @@ static int connect_done_func(void *)
JAVAConn::ResetJVM();
#endif // JAVA_SUPPORT
#if !defined(__WIN__)
#if !defined(_WIN32)
PROFILE_End();
#endif // !__WIN__
#endif // !_WIN32
pthread_mutex_lock(&usrmut);
for (pc= user_connect::to_users; pc; pc= pn) {
@@ -939,11 +943,11 @@ ha_connect::ha_connect(handlerton *hton, TABLE_SHARE *table_arg)
xp= (table) ? GetUser(ha_thd(), NULL) : NULL;
if (xp)
xp->SetHandler(this);
#if defined(__WIN__)
#if defined(_WIN32)
datapath= ".\\";
#else // !__WIN__
#else // !_WIN32
datapath= "./";
#endif // !__WIN__
#endif // !_WIN32
tdbp= NULL;
sdvalin1= sdvalin2= sdvalin3= sdvalin4= NULL;
sdvalout= NULL;
@@ -4371,7 +4375,6 @@ int ha_connect::info(uint flag)
// tdbp must be available to get updated info
if (xp->CheckQuery(valid_query_id) || !tdbp) {
PDBUSER dup= PlgGetUser(g);
PCATLG cat= (dup) ? dup->Catalog : NULL;
if (xmod == MODE_ANY || xmod == MODE_ALTER) {
// Pure info, not a query
@@ -4547,11 +4550,11 @@ static bool checkPrivileges(THD *thd, TABTYPE type, PTOS options,
strcpy(dbpath, mysql_real_data_home);
if (db)
#if defined(__WIN__)
#if defined(_WIN32)
strcat(strcat(dbpath, db), "\\");
#else // !__WIN__
#else // !_WIN32
strcat(strcat(dbpath, db), "/");
#endif // !__WIN__
#endif // !_WIN32
(void)fn_format(path, options->filename, dbpath, "",
MY_RELATIVE_PATH | MY_UNPACK_FILENAME);
@@ -5469,14 +5472,13 @@ static bool add_field(String* sql, TABTYPE ttp, const char* field_name, int typ,
} // endif rem
if (fmt && *fmt) {
switch (ttp) {
case TAB_JSON: error |= sql->append(" JPATH='"); break;
#if defined(BSON_SUPPORT)
case TAB_BSON: error |= sql->append(" JPATH='"); break;
#endif // BSON_SUPPORT
case TAB_XML: error |= sql->append(" XPATH='"); break;
default: error |= sql->append(" FIELD_FORMAT='");
} // endswitch ttp
switch (ttp) {
case TAB_MONGO:
case TAB_BSON:
case TAB_JSON: error |= sql->append(" JPATH='"); break;
case TAB_XML: error |= sql->append(" XPATH='"); break;
default: error |= sql->append(" FIELD_FORMAT='");
} // endswitch ttp
error |= sql->append_for_single_quote(fmt, strlen(fmt));
error |= sql->append("'");
@@ -5607,11 +5609,11 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
PCSZ user, fn, db, host, pwd, sep, tbl, src;
PCSZ col, ocl, rnk, pic, fcl, skc, zfn;
char *tab, *dsn, *shm, *dpath, *url;
#if defined(__WIN__)
#if defined(_WIN32)
PCSZ nsp= NULL, cls= NULL;
#endif // __WIN__
#endif // _WIN32
//int hdr, mxe;
int port= 0, mxr= 0, rc= 0, mul= 0, lrecl= 0;
int port= 0, mxr= 0, rc= 0, mul= 0;
//PCSZ tabtyp= NULL;
#if defined(ODBC_SUPPORT)
POPARM sop= NULL;
@@ -5625,7 +5627,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
#endif // JAVA_SUPPORT
uint tm, fnc= FNC_NO, supfnc= (FNC_NO | FNC_COL);
bool bif, ok= false, dbf= false;
TABTYPE ttp= TAB_UNDEF;
TABTYPE ttp= TAB_UNDEF, ttr=TAB_UNDEF;
PQRYRES qrp= NULL;
PCOLRES crp;
PCONNECT xp= NULL;
@@ -5634,8 +5636,6 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
if (!g)
return HA_ERR_INTERNAL_ERROR;
PDBUSER dup= PlgGetUser(g);
PCATLG cat= (dup) ? dup->Catalog : NULL;
PTOS topt= table_s->option_struct;
char buf[1024];
String sql(buf, sizeof(buf), system_charset_info);
@@ -5670,10 +5670,10 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
skc= GetListOption(g, "skipcol", topt->oplist, NULL);
rnk= GetListOption(g, "rankcol", topt->oplist, NULL);
pwd= GetListOption(g, "password", topt->oplist);
#if defined(__WIN__)
#if defined(_WIN32)
nsp= GetListOption(g, "namespace", topt->oplist);
cls= GetListOption(g, "class", topt->oplist);
#endif // __WIN__
#endif // _WIN32
port= atoi(GetListOption(g, "port", topt->oplist, "0"));
#if defined(ODBC_SUPPORT)
// tabtyp= GetListOption(g, "Tabtype", topt->oplist, NULL);
@@ -5707,7 +5707,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
topt->type= (src) ? "MYSQL" : (tab) ? "PROXY" : "DOS";
ttp= GetTypeID(topt->type);
sprintf(g->Message, "No table_type. Was set to %s", topt->type);
push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message);
push_warning(thd, Sql_condition::WARN_LEVEL_NOTE, 0, g->Message);
} else if (ttp == TAB_NIY) {
sprintf(g->Message, "Unsupported table type %s", topt->type);
rc= HA_ERR_INTERNAL_ERROR;
@@ -5715,13 +5715,13 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
#if defined(REST_SUPPORT)
} else if (topt->http) {
if (ttp == TAB_UNDEF) {
topt->type = "JSON";
ttp= GetTypeID(topt->type);
sprintf(g->Message, "No table_type. Was set to %s", topt->type);
push_warning(thd, Sql_condition::WARN_LEVEL_WARN, 0, g->Message);
} // endif ttp
ttr= TAB_JSON;
strcpy(g->Message, "No table_type. Was set to JSON");
push_warning(thd, Sql_condition::WARN_LEVEL_NOTE, 0, g->Message);
} else
ttr= ttp;
switch (ttp) {
switch (ttr) {
case TAB_JSON:
#if defined(BSON_SUPPORT)
case TAB_BSON:
@@ -5904,11 +5904,11 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
ok= false;
break;
#if defined(__WIN__)
#if defined(_WIN32)
case TAB_WMI:
ok= true;
break;
#endif // __WIN__
#endif // _WIN32
case TAB_PIVOT:
supfnc= FNC_NO;
case TAB_PRX:
@@ -5940,9 +5940,10 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
if (!fn && !zfn && !mul && !dsn)
sprintf(g->Message, "Missing %s file name", topt->type);
else
ok= true;
else if (dsn && !topt->tabname)
topt->tabname= tab;
ok= true;
break;
#if defined(JAVA_SUPPORT)
case TAB_MONGO:
@@ -5955,7 +5956,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
#if defined(REST_SUPPORT)
case TAB_REST:
if (!topt->http)
sprintf(g->Message, "Missing %s HTTP address", topt->type);
strcpy(g->Message, "Missing REST HTTP option");
else
ok = true;
@@ -6071,11 +6072,11 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
case TAB_CSV:
qrp= CSVColumns(g, dpath, topt, fnc == FNC_COL);
break;
#if defined(__WIN__)
#if defined(_WIN32)
case TAB_WMI:
qrp= WMIColumns(g, nsp, cls, fnc == FNC_COL);
break;
#endif // __WIN__
#endif // _WIN32
case TAB_PRX:
case TAB_TBL:
case TAB_XCL:
@@ -6175,7 +6176,7 @@ static int connect_assisted_discovery(handlerton *, THD* thd,
// Restore language type
if (ttp == TAB_REST)
ttp = GetTypeID(topt->type);
ttp = ttr;
for (i= 0; !rc && i < qrp->Nblin; i++) {
typ= len= prec= dec= flg= 0;
@@ -6605,11 +6606,11 @@ int ha_connect::create(const char *name, TABLE *table_arg,
// on Windows and libxml2 otherwise
switch (toupper(*xsup)) {
case '*':
#if defined(__WIN__)
#if defined(_WIN32)
dom= true;
#else // !__WIN__
#else // !_WIN32
dom= false;
#endif // !__WIN__
#endif // !_WIN32
break;
case 'M':
case 'D':
@@ -6992,11 +6993,11 @@ bool ha_connect::FileExists(const char *fn, bool bf)
int n;
struct stat info;
#if defined(__WIN__)
#if defined(_WIN32)
s= "\\";
#else // !__WIN__
#else // !_WIN32
s= "/";
#endif // !__WIN__
#endif // !_WIN32
if (IsPartitioned()) {
sprintf(tfn, fn, GetPartName());
@@ -7513,7 +7514,7 @@ maria_declare_plugin(connect)
0x0107, /* version number (1.07) */
NULL, /* status variables */
connect_system_variables, /* system variables */
"1.07.0002", /* string version */
"1.07.0003", /* string version */
MariaDB_PLUGIN_MATURITY_STABLE /* maturity */
}
maria_declare_plugin_end;

View File

@@ -6,24 +6,24 @@
/* This file contains the JAVA connection classes functions. */
/***********************************************************************/
#if defined(__WIN__)
#if defined(_WIN32)
// This is needed for RegGetValue
#define _WINVER 0x0601
#undef _WIN32_WINNT
#define _WIN32_WINNT 0x0601
#endif // __WIN__
#endif // _WIN32
/***********************************************************************/
/* Include relevant MariaDB header file. */
/***********************************************************************/
#include <my_global.h>
//#include <m_string.h>
#if defined(__WIN__)
#if defined(_WIN32)
#include <direct.h> // for getcwd
#if defined(__BORLANDC__)
#define __MFC_COMPAT__ // To define min/max as macro
#endif // __BORLANDC__
#else // !__WIN__
#else // !_WIN32
#if defined(UNIX)
#include <errno.h>
#else // !UNIX
@@ -31,7 +31,7 @@
#include <stdio.h>
#include <stdlib.h> // for getenv
#define NODW
#endif // !__WIN__
#endif // !_WIN32
/***********************************************************************/
/* Required objects includes. */
@@ -47,9 +47,9 @@
#include "valblk.h"
#include "osutil.h"
#if defined(__WIN__)
#if defined(_WIN32)
extern "C" HINSTANCE s_hModule; // Saved module handle
#endif // __WIN__
#endif // _WIN32
#define nullptr 0
//TYPCONV GetTypeConv();
@@ -57,6 +57,8 @@ extern "C" HINSTANCE s_hModule; // Saved module handle
extern char *JvmPath; // The connect_jvm_path global variable value
extern char *ClassPath; // The connect_class_path global variable value
char *GetPluginDir(void);
char *GetMessageDir(void);
char *GetJavaWrapper(void); // The connect_java_wrapper variable value
extern MYSQL_PLUGIN_IMPORT char lc_messages_dir[FN_REFLEN];
@@ -199,11 +201,11 @@ int JAVAConn::GetMaxValue(int n)
void JAVAConn::ResetJVM(void)
{
if (LibJvm) {
#if defined(__WIN__)
#if defined(_WIN32)
FreeLibrary((HMODULE)LibJvm);
#else // !__WIN__
#else // !_WIN32
dlclose(LibJvm);
#endif // !__WIN__
#endif // !_WIN32
LibJvm = NULL;
CreateJavaVM = NULL;
GetCreatedJavaVMs = NULL;
@@ -226,7 +228,7 @@ bool JAVAConn::GetJVM(PGLOBAL g)
if (!LibJvm) {
char soname[512];
#if defined(__WIN__)
#if defined(_WIN32)
for (ntry = 0; !LibJvm && ntry < 3; ntry++) {
if (!ntry && JvmPath) {
strcat(strcpy(soname, JvmPath), "\\jvm.dll");
@@ -294,7 +296,7 @@ bool JAVAConn::GetJVM(PGLOBAL g)
LibJvm = NULL;
#endif // _DEBUG
} // endif LibJvm
#else // !__WIN__
#else // !_WIN32
const char *error = NULL;
for (ntry = 0; !LibJvm && ntry < 2; ntry++) {
@@ -335,7 +337,7 @@ bool JAVAConn::GetJVM(PGLOBAL g)
LibJvm = NULL;
#endif // _DEBUG
} // endif LibJvm
#endif // !__WIN__
#endif // !_WIN32
} // endif LibJvm
@@ -377,7 +379,7 @@ bool JAVAConn::Open(PGLOBAL g)
char *cp = NULL;
char sep;
#if defined(__WIN__)
#if defined(_WIN32)
sep = ';';
#define N 1
//#define N 2
@@ -400,24 +402,17 @@ bool JAVAConn::Open(PGLOBAL g)
jpop->Append(ClassPath);
} // endif ClassPath
#if 0
// Java source will be compiled as a jar file installed in the mysql share dir
// All wrappers are pre-compiled in JavaWrappers.jar in the share dir
jpop->Append(sep);
jpop->Append(lc_messages_dir);
jpop->Append("JdbcInterface.jar");
#endif // 0
// All wrappers are pre-compiled in JavaWrappers.jar in the mysql share dir
jpop->Append(sep);
jpop->Append(lc_messages_dir);
jpop->Append(GetMessageDir());
jpop->Append("JavaWrappers.jar");
#if defined(MONGO_SUPPORT)
jpop->Append(sep);
jpop->Append(lc_messages_dir);
jpop->Append(GetMessageDir());
jpop->Append("Mongo3.jar");
jpop->Append(sep);
jpop->Append(lc_messages_dir);
jpop->Append(GetMessageDir());
jpop->Append("Mongo2.jar");
#endif // MONGO_SUPPORT

View File

@@ -27,9 +27,9 @@
//efine MAX_CURSOR_NAME 18 // Max size of a cursor name
//efine DEFAULT_FIELD_TYPE 0 // TYPE_NULL
#if !defined(__WIN__)
#if !defined(_WIN32)
typedef unsigned char *PUCHAR;
#endif // !__WIN__
#endif // !_WIN32
enum JCATINFO {
JCAT_TAB = 1, // JDBC Tables
@@ -104,11 +104,11 @@ public:
protected:
// Members
#if defined(__WIN__)
#if defined(_WIN32)
static HANDLE LibJvm; // Handle to the jvm DLL
#else // !__WIN__
#else // !_WIN32
static void *LibJvm; // Handle for the jvm shared library
#endif // !__WIN__
#endif // !_WIN32
static CRTJVM CreateJavaVM;
static GETJVM GetCreatedJavaVMs;
#if defined(_DEBUG)

View File

@@ -6,19 +6,19 @@
/* This file contains the JDBC connection classes functions. */
/***********************************************************************/
#if defined(__WIN__)
#if defined(_WIN32)
// This is needed for RegGetValue
#define _WINVER 0x0601
#undef _WIN32_WINNT
#define _WIN32_WINNT 0x0601
#endif // __WIN__
#endif // _WIN32
/***********************************************************************/
/* Include relevant MariaDB header file. */
/***********************************************************************/
#include <my_global.h>
#include <m_string.h>
#if defined(__WIN__)
#if defined(_WIN32)
//nclude <io.h>
//nclude <fcntl.h>
#include <direct.h> // for getcwd
@@ -26,7 +26,7 @@
#define __MFC_COMPAT__ // To define min/max as macro
#endif // __BORLANDC__
//#include <windows.h>
#else // !__WIN__
#else // !_WIN32
#if defined(UNIX)
#include <errno.h>
#else // !UNIX
@@ -36,7 +36,7 @@
#include <stdlib.h> // for getenv
//nclude <fcntl.h>
#define NODW
#endif // !__WIN__
#endif // !_WIN32
/***********************************************************************/
/* Required objects includes. */
@@ -53,9 +53,9 @@
#include "osutil.h"
//#if defined(__WIN__)
//#if defined(_WIN32)
//extern "C" HINSTANCE s_hModule; // Saved module handle
//#endif // __WIN__
//#endif // _WIN32
#define nullptr 0
TYPCONV GetTypeConv();

View File

@@ -1,11 +1,11 @@
/************ JMONGO FAM C++ Program Source Code File (.CPP) ***********/
/* PROGRAM NAME: jmgfam.cpp */
/* ------------- */
/* Version 1.1 */
/* Version 1.2 */
/* */
/* COPYRIGHT: */
/* ---------- */
/* (C) Copyright to the author Olivier BERTRAND 20017 - 2020 */
/* (C) Copyright to the author Olivier BERTRAND 20017 - 2021 */
/* */
/* WHAT THIS PROGRAM DOES: */
/* ----------------------- */
@@ -17,7 +17,7 @@
/* Include relevant sections of the System header files. */
/***********************************************************************/
#include "my_global.h"
#if defined(__WIN__)
#if defined(_WIN32)
//#include <io.h>
//#include <fcntl.h>
//#include <errno.h>
@@ -25,7 +25,7 @@
#define __MFC_COMPAT__ // To define min/max as macro
#endif // __BORLANDC__
//#include <windows.h>
#else // !__WIN__
#else // !_WIN32
#if defined(UNIX) || defined(UNIV_LINUX)
//#include <errno.h>
#include <unistd.h>
@@ -36,7 +36,7 @@
//#include <io.h>
#endif // !UNIX
//#include <fcntl.h>
#endif // !__WIN__
#endif // !_WIN32
/***********************************************************************/
/* Include application header files: */
@@ -241,8 +241,8 @@ bool JMGFAM::OpenTableFile(PGLOBAL g)
return true;
} // endif Mode
if (Mode == MODE_INSERT)
Jcp->MakeColumnGroups(g, Tdbp);
//if (Mode == MODE_INSERT)
// Jcp->MakeColumnGroups(g, Tdbp);
if (Mode != MODE_UPDATE)
return Jcp->MakeCursor(g, Tdbp, Options, Filter, Pipe);
@@ -346,14 +346,14 @@ int JMGFAM::ReadBuffer(PGLOBAL g)
} // end of ReadBuffer
/***********************************************************************/
/* WriteBuffer: File write routine for MGO access method. */
/* WriteBuffer: File write routine for JMG access method. */
/***********************************************************************/
int JMGFAM::WriteBuffer(PGLOBAL g)
{
int rc = RC_OK;
if (Mode == MODE_INSERT) {
rc = Jcp->DocWrite(g);
rc = Jcp->DocWrite(g, Tdbp->GetLine());
} else if (Mode == MODE_DELETE) {
rc = Jcp->DocDelete(g, false);
} else if (Mode == MODE_UPDATE) {

View File

@@ -1,7 +1,7 @@
/************ JMgoConn C++ Functions Source Code File (.CPP) ***********/
/* Name: JMgoConn.CPP Version 1.1 */
/* Name: JMgoConn.CPP Version 1.2 */
/* */
/* (C) Copyright to the author Olivier BERTRAND 2017 */
/* (C) Copyright to the author Olivier BERTRAND 2017 - 2021 */
/* */
/* This file contains the MongoDB Java connection classes functions. */
/***********************************************************************/
@@ -24,7 +24,7 @@
#define nullptr 0
bool IsNum(PSZ s);
bool IsArray(PSZ s);
bool MakeSelector(PGLOBAL g, PFIL fp, PSTRG s);
/* --------------------------- Class JNCOL --------------------------- */
@@ -43,19 +43,21 @@ void JNCOL::AddCol(PGLOBAL g, PCOL colp, PSZ jp)
*p++ = 0;
for (kp = Klist; kp; kp = kp->Next)
if (kp->Jncolp && !strcmp(jp, kp->Key))
if (kp->Jncolp && ((kp->Key && !strcmp(jp, kp->Key))
|| (!kp->Key && IsArray(jp) && kp->N == atoi(jp))))
break;
if (!kp) {
icp = new(g) JNCOL(IsNum(p));
icp = new(g) JNCOL();
kcp = (PJKC)PlugSubAlloc(g, NULL, sizeof(JKCOL));
kcp->Next = NULL;
kcp->Jncolp = icp;
kcp->Colp = NULL;
kcp->Array = IsArray(jp);
if (Array) {
if (kcp->Array) {
kcp->Key = NULL;
kcp->N = atoi(p);
kcp->N = atoi(jp);
} else {
kcp->Key = PlugDup(g, jp);
kcp->N = 0;
@@ -75,12 +77,12 @@ void JNCOL::AddCol(PGLOBAL g, PCOL colp, PSZ jp)
icp->AddCol(g, colp, p);
} else {
kcp = (PJKC)PlugSubAlloc(g, NULL, sizeof(JKCOL));
kcp->Next = NULL;
kcp->Jncolp = NULL;
kcp->Colp = colp;
kcp->Array = IsArray(jp);
if (Array) {
if (kcp->Array) {
kcp->Key = NULL;
kcp->N = atoi(jp);
} else {
@@ -108,7 +110,7 @@ JMgoConn::JMgoConn(PGLOBAL g, PCSZ collname, PCSZ wrapper)
CollName = collname;
readid = fetchid = getdocid = objfldid = fcollid = acollid =
mkdocid = docaddid = mkarid = araddid = insertid = updateid =
deleteid = gcollid = countid = rewindid = nullptr;
deleteid = gcollid = countid = rewindid = mkbsonid = nullptr;
DiscFunc = "MongoDisconnect";
Fpc = NULL;
m_Fetch = 0;
@@ -235,7 +237,7 @@ bool JMgoConn::MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options,
PCSZ filter, bool pipe)
{
const char *p;
bool b = false, id = (tdbp->GetMode() != MODE_READ), all = false;
bool id, b = false, all = false;
uint len;
PCOL cp;
PSZ jp;
@@ -246,13 +248,14 @@ bool JMgoConn::MakeCursor(PGLOBAL g, PTDB tdbp, PCSZ options,
if (Options && !stricmp(Options, "all")) {
Options = NULL;
all = true;
} // endif Options
} else
id = (tdbp->GetMode() == MODE_UPDATE || tdbp->GetMode() == MODE_DELETE);
for (cp = tdbp->GetColumns(); cp; cp = cp->GetNext())
if (!strcmp(cp->GetName(), "_id"))
id = true;
else if (cp->GetFmt() && !strcmp(cp->GetFmt(), "*") && (!Options || pipe))
for (cp = tdbp->GetColumns(); cp && !all; cp = cp->GetNext())
if (cp->GetFmt() && !strcmp(cp->GetFmt(), "*") && (!Options || pipe))
all = true;
else if (!id)
id = !strcmp(cp->GetJpath(g, false), "_id");
if (pipe && Options) {
if (trace(1))
@@ -535,7 +538,7 @@ PSZ JMgoConn::GetDocument(void)
/***********************************************************************/
void JMgoConn::MakeColumnGroups(PGLOBAL g, PTDB tdbp)
{
Fpc = new(g) JNCOL(false);
Fpc = new(g) JNCOL();
for (PCOL colp = tdbp->GetColumns(); colp; colp = colp->GetNext())
if (!colp->IsSpecial())
@@ -553,7 +556,7 @@ bool JMgoConn::GetMethodId(PGLOBAL g, MODE mode)
return true;
if (gmID(g, docaddid, "DocAdd",
"(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)Z"))
"(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;I)Z"))
return true;
if (gmID(g, updateid, "CollUpdate", "(Ljava/lang/Object;)J"))
@@ -563,14 +566,19 @@ bool JMgoConn::GetMethodId(PGLOBAL g, MODE mode)
if (gmID(g, mkdocid, "MakeDocument", "()Ljava/lang/Object;"))
return true;
if (gmID(g, mkbsonid, "MakeBson",
"(Ljava/lang/String;I)Ljava/lang/Object;"))
return true;
if (gmID(g, docaddid, "DocAdd",
"(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)Z"))
"(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;I)Z"))
return true;
if (gmID(g, mkarid, "MakeArray", "()Ljava/lang/Object;"))
return true;
if (gmID(g, araddid, "ArrayAdd", "(Ljava/lang/Object;ILjava/lang/Object;)Z"))
if (gmID(g, araddid, "ArrayAdd",
"(Ljava/lang/Object;ILjava/lang/Object;I)Z"))
return true;
if (gmID(g, insertid, "CollInsert", "(Ljava/lang/Object;)Z"))
@@ -638,49 +646,82 @@ jobject JMgoConn::MakeObject(PGLOBAL g, PCOL colp, bool&error )
return val;
} // end of MakeObject
/***********************************************************************/
/* Stringify. */
/***********************************************************************/
bool JMgoConn::Stringify(PCOL colp)
{
bool b = false;
if (colp)
b = (colp->Stringify() && colp->GetResultType() == TYPE_STRING);
return b;
} // end of Stringify
/***********************************************************************/
/* MakeDoc. */
/***********************************************************************/
jobject JMgoConn::MakeDoc(PGLOBAL g, PJNCOL jcp)
{
bool error = false;
int j;
bool b, error = false;
jobject parent, child, val;
jstring jkey;
if (jcp->Array)
PJKC kp = jcp->Klist;
if (kp->Array)
parent = env->CallObjectMethod(job, mkarid);
else
parent = env->CallObjectMethod(job, mkdocid);
for (PJKC kp = jcp->Klist; kp; kp = kp->Next)
for (j = 0; kp; j = 0, kp = kp->Next) {
if (Stringify(kp->Colp)) {
switch (*kp->Colp->GetCharValue()) {
case '{': j = 1; break;
case '[': j = 2; break;
default: break;
} // endswitch
b = (!kp->Key || !*kp->Key || *kp->Key == '*');
} else
b = false;
if (kp->Jncolp) {
if (!(child = MakeDoc(g, kp->Jncolp)))
return NULL;
if (!jcp->Array) {
if (!kp->Array) {
jkey = env->NewStringUTF(kp->Key);
if (env->CallBooleanMethod(job, docaddid, parent, jkey, child))
if (env->CallBooleanMethod(job, docaddid, parent, jkey, child, j))
return NULL;
env->DeleteLocalRef(jkey);
} else
if (env->CallBooleanMethod(job, araddid, parent, kp->N, child))
if (env->CallBooleanMethod(job, araddid, parent, kp->N, child, j))
return NULL;
env->DeleteLocalRef(child);
} else {
if (!(val = MakeObject(g, kp->Colp, error))) {
if (error)
return NULL;
} else if (!jcp->Array) {
jkey = env->NewStringUTF(kp->Key);
} else if (!kp->Array) {
if (!b) {
jkey = env->NewStringUTF(kp->Key);
if (env->CallBooleanMethod(job, docaddid, parent, jkey, val))
return NULL;
if (env->CallBooleanMethod(job, docaddid, parent, jkey, val, j))
return NULL;
env->DeleteLocalRef(jkey);
} else if (env->CallBooleanMethod(job, araddid, parent, kp->N, val)) {
env->DeleteLocalRef(jkey);
} else {
env->DeleteLocalRef(parent);
parent = env->CallObjectMethod(job, mkbsonid, val, j);
} // endif b
} else if (env->CallBooleanMethod(job, araddid, parent, kp->N, val, j)) {
if (Check(-1))
sprintf(g->Message, "ArrayAdd: %s", Msg);
else
@@ -689,19 +730,38 @@ jobject JMgoConn::MakeDoc(PGLOBAL g, PJNCOL jcp)
return NULL;
} // endif ArrayAdd
env->DeleteLocalRef(val);
} // endif Jncolp
} // endfor kp
return parent;
} // end of MakeDoc
/***********************************************************************/
/* Insert a new document in the collation. */
/***********************************************************************/
int JMgoConn::DocWrite(PGLOBAL g)
int JMgoConn::DocWrite(PGLOBAL g, PCSZ line)
{
jobject doc;
int rc = RC_OK;
jobject doc = nullptr;
if (!Fpc || !(doc = MakeDoc(g, Fpc)))
if (line) {
int j;
jobject val = env->NewStringUTF(line);
switch (*line) {
case '{': j = 1; break;
case '[': j = 2; break;
default: j = 0; break;
} // endswitch line
doc = env->CallObjectMethod(job, mkbsonid, val, j);
env->DeleteLocalRef(val);
} else if (Fpc)
doc = MakeDoc(g, Fpc);
if (!doc)
return RC_FX;
if (env->CallBooleanMethod(job, insertid, doc)) {
@@ -710,10 +770,11 @@ int JMgoConn::DocWrite(PGLOBAL g)
else
sprintf(g->Message, "CollInsert: unknown error");
return RC_FX;
rc = RC_FX;
} // endif Insert
return RC_OK;
env->DeleteLocalRef(doc);
return rc;
} // end of DocWrite
/***********************************************************************/
@@ -721,7 +782,7 @@ int JMgoConn::DocWrite(PGLOBAL g)
/***********************************************************************/
int JMgoConn::DocUpdate(PGLOBAL g, PTDB tdbp)
{
int rc = RC_OK;
int j = 0, rc = RC_OK;
bool error;
PCOL colp;
jstring jkey;
@@ -734,8 +795,14 @@ int JMgoConn::DocUpdate(PGLOBAL g, PTDB tdbp)
if (error)
return RC_FX;
else if (Stringify(colp))
switch (*colp->GetCharValue()) {
case '{': j = 1; break;
case '[': j = 2; break;
default: break;
} // endswitch
if (env->CallBooleanMethod(job, docaddid, updlist, jkey, val))
if (env->CallBooleanMethod(job, docaddid, updlist, jkey, val, j))
return RC_OK;
env->DeleteLocalRef(jkey);
@@ -745,7 +812,7 @@ int JMgoConn::DocUpdate(PGLOBAL g, PTDB tdbp)
upd = env->CallObjectMethod(job, mkdocid);
jkey = env->NewStringUTF("$set");
if (env->CallBooleanMethod(job, docaddid, upd, jkey, updlist))
if (env->CallBooleanMethod(job, docaddid, upd, jkey, updlist, 0))
return RC_OK;
env->DeleteLocalRef(jkey);

View File

@@ -25,6 +25,7 @@ typedef struct JKCOL {
PCOL Colp;
char *Key;
int N;
bool Array;
} *PJKC;
/***********************************************************************/
@@ -33,18 +34,18 @@ typedef struct JKCOL {
class JNCOL : public BLOCK {
public:
// Constructor
JNCOL(bool ar) { Klist = NULL; Array = ar; }
//JNCOL(bool ar) { Klist = NULL; Array = ar; }
JNCOL(void) { Klist = NULL; }
// Methods
void AddCol(PGLOBAL g, PCOL colp, PSZ jp);
//Members
PJKC Klist;
bool Array;
}; // end of JNCOL;
/***********************************************************************/
/* JMgoConn class. */
/* JMgoConn class. */
/***********************************************************************/
class JMgoConn : public JAVAConn {
friend class TDBJMG;
@@ -81,11 +82,12 @@ public:
bool GetMethodId(PGLOBAL g, MODE mode);
jobject MakeObject(PGLOBAL g, PCOL colp, bool& error);
jobject MakeDoc(PGLOBAL g, PJNCOL jcp);
int DocWrite(PGLOBAL g);
int DocWrite(PGLOBAL g, PCSZ line);
int DocUpdate(PGLOBAL g, PTDB tdbp);
int DocDelete(PGLOBAL g, bool all);
bool Rewind(void);
PSZ GetDocument(void);
bool Stringify(PCOL colp);
protected:
// Members
@@ -100,6 +102,7 @@ protected:
jmethodID getdocid; // The GetDoc method ID
jmethodID objfldid; // The ObjectField method ID
jmethodID mkdocid; // The MakeDocument method ID
jmethodID mkbsonid; // The MakeBson method ID
jmethodID docaddid; // The DocAdd method ID
jmethodID mkarid; // The MakeArray method ID
jmethodID araddid; // The ArrayAdd method ID

View File

@@ -1,7 +1,7 @@
/*************** json CPP Declares Source Code File (.H) ***************/
/* Name: json.cpp Version 1.5 */
/* Name: json.cpp Version 1.6 */
/* */
/* (C) Copyright to the author Olivier BERTRAND 2014 - 2020 */
/* (C) Copyright to the author Olivier BERTRAND 2014 - 2021 */
/* */
/* This file contains the JSON classes functions. */
/***********************************************************************/
@@ -23,7 +23,7 @@
#define ARGS MY_MIN(24,(int)len-i),s+MY_MAX(i-3,0)
#if defined(__WIN__)
#if defined(_WIN32)
#define EL "\r\n"
#else
#define EL "\n"
@@ -55,6 +55,7 @@ char *GetExceptionDesc(PGLOBAL g, unsigned int e);
char *GetJsonNull(void);
int GetDefaultPrec(void);
int PrepareColist(char*);
/***********************************************************************/
/* IsNum: check whether this string is all digits. */
@@ -77,6 +78,24 @@ bool IsNum(PSZ s)
return true;
} // end of IsNum
/***********************************************************************/
/* IsArray: check whether this is a Mongo array path. */
/***********************************************************************/
bool IsArray(PSZ s)
{
char* p = s;
if (!p || !*p)
return false;
else for (; *p; p++)
if (*p == '.')
break;
else if (!isdigit(*p))
return false;
return true;
} // end of IsArray
/***********************************************************************/
/* NextChr: return the first found '[' or Sep pointer. */
/***********************************************************************/
@@ -93,6 +112,27 @@ char* NextChr(PSZ s, char sep)
return p2;
} // end of NextChr
/***********************************************************************/
/* Stringified: check that this column is in the stringified list. */
/***********************************************************************/
bool Stringified(PCSZ strfy, char *colname)
{
if (strfy) {
char *p, colist[512];
int n;
strncpy(colist, strfy, sizeof(colist) - 1);
n = PrepareColist(colist);
for (p = colist; n && p; p += (strlen(p) + 1), n--)
if (!stricmp(p, colname))
return true;
} // endif strfy
return false;
} // end of Stringified
#if 0
/***********************************************************************/
/* Allocate a VAL structure, make sure common field and Nd are zeroed. */
@@ -227,6 +267,7 @@ PSZ Serialize(PGLOBAL g, PJSON jsp, char* fn, int pretty) {
try {
jdp = new(g) JDOC; // MUST BE ALLOCATED BEFORE jp !!!!!
jdp->dfp = GetDefaultPrec();
if (!jsp) {
strcpy(g->Message, "Null json tree");
@@ -987,8 +1028,8 @@ bool JDOC::SerializeValue(PJVAL jvp)
case TYPE_BINT:
sprintf(buf, "%lld", jvp->LLn);
return js->WriteStr(buf);
case TYPE_DBL:
sprintf(buf, "%.*lf", jvp->Nd, jvp->F);
case TYPE_DBL: // dfp to limit to the default number of decimals
sprintf(buf, "%.*f", MY_MIN(jvp->Nd, dfp), jvp->F);
return js->WriteStr(buf);
case TYPE_NULL:
return js->WriteStr("null");
@@ -1326,9 +1367,9 @@ bool JARRAY::Merge(PGLOBAL g, PJSON jsp)
} // end of Merge
/***********************************************************************/
/* Set the nth Value of the Array Value list. */
/* Set the nth Value of the Array Value list or add it. */
/***********************************************************************/
bool JARRAY::SetArrayValue(PGLOBAL g, PJVAL jvp, int n)
void JARRAY::SetArrayValue(PGLOBAL g, PJVAL jvp, int n)
{
int i = 0;
PJVAL jp, *jpp = &First;
@@ -1339,7 +1380,6 @@ bool JARRAY::SetArrayValue(PGLOBAL g, PJVAL jvp, int n)
*jpp = jvp;
jvp->Next = (jp ? jp->Next : NULL);
return false;
} // end of SetValue
/***********************************************************************/
@@ -1417,7 +1457,7 @@ bool JARRAY::IsNull(void)
/***********************************************************************/
JVALUE::JVALUE(PJSON jsp) : JSON()
{
if (jsp->GetType() == TYPE_JVAL) {
if (jsp && jsp->GetType() == TYPE_JVAL) {
PJVAL jvp = (PJVAL)jsp;
// Val = ((PJVAL)jsp)->GetVal();
@@ -1434,7 +1474,7 @@ JVALUE::JVALUE(PJSON jsp) : JSON()
} else {
Jsp = jsp;
// Val = NULL;
DataType = TYPE_JSON;
DataType = Jsp ? TYPE_JSON : TYPE_NULL;
Nd = 0;
} // endif Type

View File

@@ -66,6 +66,8 @@ const char* GetFmt(int type, bool un);
PJSON ParseJson(PGLOBAL g, char* s, size_t n, int* prty = NULL, bool* b = NULL);
PSZ Serialize(PGLOBAL g, PJSON jsp, char *fn, int pretty);
DllExport bool IsNum(PSZ s);
bool IsArray(PSZ s);
bool Stringified(PCSZ strfy, char *colname);
/***********************************************************************/
/* Class JDOC. The class for parsing and serializing json documents. */
@@ -74,7 +76,7 @@ class JDOC: public BLOCK {
friend PJSON ParseJson(PGLOBAL, char*, size_t, int*, bool*);
friend PSZ Serialize(PGLOBAL, PJSON, char*, int);
public:
JDOC(void) : js(NULL), s(NULL), len(0), pty(NULL) {}
JDOC(void) : js(NULL), s(NULL), len(0), dfp(0), pty(NULL) {}
void SetJp(JOUT* jp) { js = jp; }
@@ -93,7 +95,7 @@ public:
private:
JOUT* js;
char *s;
int len;
int len, dfp;
bool *pty;
}; // end of class JDOC
@@ -184,7 +186,7 @@ class JARRAY : public JSON {
// Specific
PJVAL AddArrayValue(PGLOBAL g, PJVAL jvp = NULL, int* x = NULL);
bool SetArrayValue(PGLOBAL g, PJVAL jvp, int i);
void SetArrayValue(PGLOBAL g, PJVAL jvp, int i);
void InitArray(PGLOBAL g);
protected:

View File

@@ -1524,22 +1524,31 @@ static int *GetIntArgPtr(PGLOBAL g, UDF_ARGS *args, uint& n)
/*********************************************************************************/
int IsJson(UDF_ARGS *args, uint i, bool b)
{
int n = 0;
const char *pat = args->attributes[i];
int n = 0;
if (*pat == '@') {
pat++;
if (*pat == '\'' || *pat == '"')
pat++;
} // endif pat
if (i >= args->arg_count || args->arg_type[i] != STRING_RESULT) {
} else if (!strnicmp(args->attributes[i], "Json_", 5)) {
} else if (!strnicmp(pat, "Json_", 5)) {
if (!args->args[i] || strchr("[{ \t\r\n", *args->args[i]))
n = 1; // arg should be is a json item
else
n = 2; // A file name may have been returned
} else if (!strnicmp(args->attributes[i], "Jbin_", 5)) {
} else if (!strnicmp(pat, "Jbin_", 5)) {
if (args->lengths[i] == sizeof(BSON))
n = 3; // arg is a binary json item
else
n = 2; // A file name may have been returned
} else if (!strnicmp(args->attributes[i], "Jfile_", 6)) {
} else if (!strnicmp(pat, "Jfile_", 6)) {
n = 2; // arg is a json file name
} else if (b) {
char *sap;
@@ -5943,7 +5952,7 @@ char *jfile_convert(UDF_INIT* initid, UDF_ARGS* args, char* result,
str = (char*)g->Xchk;
if (!str) {
PUSH_WARNING(g->Message ? g->Message : "Unexpected error");
PUSH_WARNING(*g->Message ? g->Message : "Unexpected error");
*is_null = 1;
*error = 1;
*res_length = 0;
@@ -6004,7 +6013,7 @@ char *jfile_bjson(UDF_INIT *initid, UDF_ARGS *args, char *result,
if (!g->Xchk) {
int msgid = MSGID_OPEN_MODE_STRERROR;
FILE *fout;
FILE *fout = NULL;
FILE *fin;
if (!(fin = global_fopen(g, msgid, fn, "rt")))
@@ -6071,7 +6080,7 @@ char *jfile_bjson(UDF_INIT *initid, UDF_ARGS *args, char *result,
str = (char*)g->Xchk;
if (!str) {
if (g->Message)
if (*g->Message)
str = strcpy(result, g->Message);
else
str = strcpy(result, "Unexpected error");

View File

@@ -2,11 +2,11 @@
/* MACUTIL: Author Olivier Bertrand -- 2008-2012 */
/* From the article and sample code by Khalid Shaikh. */
/***********************************************************************/
#if defined(__WIN__)
#if defined(_WIN32)
#include "my_global.h"
#else // !__WIN__
#else // !_WIN32
#error This is WINDOWS only DLL
#endif // !__WIN__
#endif // !_WIN32
#include "global.h"
#include "plgdbsem.h"
#include "macutil.h"

View File

@@ -1,10 +1,10 @@
// MACUTIL.H Olivier Bertrand 2008-2012
// Get Mac Addresses via GetAdaptersInfo
#if defined(__WIN__)
#if defined(_WIN32)
#include <iphlpapi.h>
#else // !__WIN__
#else // !_WIN32
#error This is WINDOWS only
#endif // !__WIN__
#endif // !_WIN32
#include "block.h"
typedef class MACINFO *MACIP;

View File

@@ -14,7 +14,7 @@
#include "plgdbsem.h"
#include "maputil.h"
#ifdef __WIN__
#ifdef _WIN32
/***********************************************************************/
/* In Insert mode, just open the file for append. Otherwise */
/* create the mapping file object. The map handle can be released */

View File

@@ -1,6 +1,6 @@
/************** mongo C++ Program Source Code File (.CPP) **************/
/* PROGRAM NAME: mongo Version 1.0 */
/* (C) Copyright to the author Olivier BERTRAND 2017 */
/* PROGRAM NAME: mongo Version 1.1 */
/* (C) Copyright to the author Olivier BERTRAND 2021 */
/* These programs are the MGODEF class execution routines. */
/***********************************************************************/
@@ -36,6 +36,7 @@
bool MakeSelector(PGLOBAL g, PFIL fp, PSTRG s);
bool IsNum(PSZ s);
int GetDefaultDepth(void);
bool JsonAllPath(void);
/***********************************************************************/
/* Make selector json representation for Mongo tables. */
@@ -350,7 +351,7 @@ void MGODISC::AddColumn(PGLOBAL g, PCSZ colname, PCSZ fmt, int k)
bcp->Name = PlugDup(g, colname);
length[0] = MY_MAX(length[0], (signed)strlen(colname));
if (k) {
if (k || JsonAllPath()) {
bcp->Fmt = PlugDup(g, fmt);
length[7] = MY_MAX(length[7], (signed)strlen(fmt));
} else
@@ -395,6 +396,7 @@ bool MGODEF::DefineAM(PGLOBAL g, LPCSTR, int poff)
Uri = GetStringCatInfo(g, "Connect", "mongodb://localhost:27017");
Colist = GetStringCatInfo(g, "Colist", NULL);
Filter = GetStringCatInfo(g, "Filter", NULL);
Strfy = GetStringCatInfo(g, "Stringify", NULL);
Base = GetIntCatInfo("Base", 0) ? 1 : 0;
Version = GetIntCatInfo("Version", 3);

View File

@@ -1,7 +1,7 @@
/**************** mongo H Declares Source Code File (.H) ***************/
/* Name: mongo.h Version 1.0 */
/* Name: mongo.h Version 1.1 */
/* */
/* (C) Copyright to the author Olivier BERTRAND 2017 */
/* (C) Copyright to the author Olivier BERTRAND 2021 */
/* */
/* This file contains the common MongoDB classes declares. */
/***********************************************************************/
@@ -82,6 +82,7 @@ protected:
PSZ Wrapname; /* Java wrapper name */
PCSZ Colist; /* Options list */
PCSZ Filter; /* Filtering query */
PCSZ Strfy; /* The stringify columns */
int Base; /* The array index base */
int Version; /* The Java driver version */
bool Pipe; /* True is Colist is a pipeline */

View File

@@ -62,10 +62,10 @@
#include "tabvct.h"
#endif // VCT_SUPPORT
#include "tabsys.h"
#if defined(__WIN__)
#if defined(_WIN32)
#include "tabmac.h"
#include "tabwmi.h"
#endif // __WIN__
#endif // _WIN32
//#include "tabtbl.h"
#include "tabxcl.h"
#include "tabtbl.h"
@@ -105,9 +105,9 @@
/***********************************************************************/
/* Extern static variables. */
/***********************************************************************/
#if defined(__WIN__)
#if defined(_WIN32)
extern "C" HINSTANCE s_hModule; // Saved module handle
#endif // !__WIN__
#endif // !_WIN32
#if defined(JAVA_SUPPORT) || defined(CMGO_SUPPORT)
bool MongoEnabled(void);
#endif // JAVA_SUPPORT || CMGO_SUPPORT
@@ -123,6 +123,15 @@ char *GetPluginDir(void)
return opt_plugin_dir;
} // end of GetPluginDir
/***********************************************************************/
/* Get the lc_messages_dir, it is where error messages for various */
/* languages are installed, and by default the INSTALL_MYSQLSHAREDIR. */
/***********************************************************************/
char *GetMessageDir(void)
{
return lc_messages_dir;
} // end of GetMessageDir
/***********************************************************************/
/* Get a unique enum table type ID. */
/***********************************************************************/
@@ -152,10 +161,10 @@ TABTYPE GetTypeID(const char *type)
: (!stricmp(type, "MYSQL")) ? TAB_MYSQL
: (!stricmp(type, "MYPRX")) ? TAB_MYSQL
: (!stricmp(type, "DIR")) ? TAB_DIR
#if defined(__WIN__)
#if defined(_WIN32)
: (!stricmp(type, "MAC")) ? TAB_MAC
: (!stricmp(type, "WMI")) ? TAB_WMI
#endif // __WIN__
#endif // _WIN32
: (!stricmp(type, "TBL")) ? TAB_TBL
: (!stricmp(type, "XCOL")) ? TAB_XCL
: (!stricmp(type, "OCCUR")) ? TAB_OCCUR
@@ -374,11 +383,11 @@ uint GetFuncID(const char *func)
/***********************************************************************/
CATALOG::CATALOG(void)
{
#if defined(__WIN__)
#if defined(_WIN32)
//DataPath= ".\\";
#else // !__WIN__
#else // !_WIN32
//DataPath= "./";
#endif // !__WIN__
#endif // !_WIN32
memset(&Ctb, 0, sizeof(CURTAB));
Cbuf= NULL;
Cblen= 0;
@@ -472,10 +481,10 @@ PTABDEF MYCAT::MakeTableDesc(PGLOBAL g, PTABLE tablep, LPCSTR am)
#if defined(JAVA_SUPPORT)
case TAB_JDBC: tdp= new(g) JDBCDEF; break;
#endif // JAVA_SUPPORT
#if defined(__WIN__)
#if defined(_WIN32)
case TAB_MAC: tdp= new(g) MACDEF; break;
case TAB_WMI: tdp= new(g) WMIDEF; break;
#endif // __WIN__
#endif // _WIN32
case TAB_OEM: tdp= new(g) OEMDEF; break;
case TAB_TBL: tdp= new(g) TBLDEF; break;
case TAB_XCL: tdp= new(g) XCLDEF; break;

View File

@@ -78,7 +78,8 @@ struct ha_table_option_struct {
typedef class ha_connect *PHC;
char *GetPluginDir(void);
char *GetPluginDir(void);
char *GetMessageDir(void);
TABTYPE GetTypeID(const char *type);
bool IsFileType(TABTYPE type);
bool IsExactType(TABTYPE type);

View File

@@ -35,11 +35,11 @@
#include "my_sys.h"
#include "mysqld_error.h"
#endif // !MYSQL_PREPARED_STATEMENTS
#if defined(__WIN__)
#if defined(_WIN32)
//#include <windows.h>
#else // !__WIN__
#else // !_WIN32
#include "osutil.h"
#endif // !__WIN__
#endif // !_WIN32
#include "global.h"
#include "plgdbsem.h"
@@ -492,15 +492,15 @@ int MYSQLC::Open(PGLOBAL g, const char *host, const char *db,
//mysql_options(m_DB, MYSQL_OPT_READ_TIMEOUT, &nrt);
//mysql_options(m_DB, MYSQL_OPT_WRITE_TIMEOUT, ...);
#if defined(__WIN__)
#if defined(_WIN32)
if (!strcmp(host, ".")) {
mysql_options(m_DB, MYSQL_OPT_NAMED_PIPE, NULL);
pipe = mysqld_unix_port;
} // endif host
#else // !__WIN__
#else // !_WIN32
if (!strcmp(host, "localhost"))
pipe = mysqld_unix_port;
#endif // !__WIN__
#endif // !_WIN32
#if 0
if (pwd && !strcmp(pwd, "*")) {

View File

@@ -7,24 +7,24 @@
/* DO NOT define DLL_EXPORT in your application so these items are */
/* declared are imported from the Myconn DLL. */
/***********************************************************************/
#if defined(__WIN__)
#if defined(_WIN32)
#include <winsock.h>
#else // !__WIN__
#else // !_WIN32
#include <sys/socket.h>
#endif // !__WIN__
#endif // !_WIN32
#include <mysql.h>
#include <errmsg.h>
#include "myutil.h"
#if defined(__WIN__) && defined(MYCONN_EXPORTS)
#if defined(_WIN32) && defined(MYCONN_EXPORTS)
#if defined(DLL_EXPORT)
#define DllItem _declspec(dllexport)
#else // !DLL_EXPORT
#define DllItem _declspec(dllimport)
#endif // !DLL_EXPORT
#else // !__WIN__ || !MYCONN_EXPORTS
#else // !_WIN32 || !MYCONN_EXPORTS
#define DllItem
#endif // !__WIN__
#endif // !_WIN32
#define MYSQL_ENABLED 0x00000001
#define MYSQL_LOGON 0x00000002

View File

@@ -363,7 +363,7 @@ _id item prices_0 prices_1 prices_2 prices_3 prices_4
1 journal 87 45 63 12 78
2 notebook 123 456 789 NULL NULL
3 paper 5 7 3 8 NULL
4 planner 25 71 44 27 NULL
4 planner 25 71 NULL 44 27
5 postcard 5 7 3 8 NULL
DROP TABLE t1;
#

View File

@@ -1,4 +1,5 @@
SET GLOBAL time_zone='+1:00';
SET GLOBAL time_zone='+0:00';
SET time_zone='+0:00';
CREATE DATABASE connect;
USE connect;
CREATE TABLE t2 (
@@ -16,7 +17,7 @@ id msg tm dt dtm ts
# Testing JDBC connection to MySQL driver
#
USE test;
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME=t2 CONNECTION='jdbc:mysql://localhost:PORT/connect?user=root';
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME=t2 CONNECTION='jdbc:mysql://localhost:PORT/connect?user=root&useSSL=false';
SELECT * FROM t1;
id msg tm dt dtm ts
455000000000 A very big number 18:10:25 2016-03-16 1999-12-11 23:01:52 2015-07-24 09:32:45
@@ -26,7 +27,7 @@ Note 1105 t2: 1 affected rows
SELECT * FROM t1;
id msg tm dt dtm ts
455000000000 A very big number 18:10:25 2016-03-16 1999-12-11 23:01:52 2015-07-24 09:32:45
786325481247 Hello! 19:45:03 1933-08-09 1985-11-12 09:02:44 2014-06-17 10:32:01
786325481247 Hello! 19:45:03 1933-08-10 1985-11-12 09:02:44 2014-06-17 10:32:01
DELETE FROM t1 WHERE msg = 'Hello!';
Warnings:
Note 1105 t2: 1 affected rows
@@ -37,7 +38,7 @@ DROP TABLE t1;
#
# Testing JDBC view
#
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC SRCDEF='select id, msg, tm, dt from t2' CONNECTION='jdbc:mysql://localhost:PORT/connect?user=root';
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC SRCDEF='select id, msg, tm, dt from t2' CONNECTION='jdbc:mysql://localhost:PORT/connect?user=root&useSSL=false';
SELECT * FROM t1;
id msg tm dt
455000000000 A very big number 18:10:25 2016-03-16
@@ -74,7 +75,7 @@ SELECT * FROM t3;
name city birth hired
Donald Atlanta 1999-04-01 2016-03-31
Mick New York 1980-01-20 2002-09-11
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME=boys CONNECTION='jdbc:mysql://localhost:PORT/connect?user=root' OPTION_LIST='scrollable=1';
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME=boys CONNECTION='jdbc:mysql://localhost:PORT/connect?user=root&useSSL=false' OPTION_LIST='scrollable=1';
SELECT * FROM t1;
name city birth hired
John Boston 1986-01-25 2010-06-02
@@ -100,9 +101,9 @@ George San Jose 1981-08-10 2010-06-02
Sam Chicago 1979-11-22 2007-10-10
James Dallas 1992-05-13 2009-12-14
Bill Boston 1986-09-11 2008-02-10
Donald Atlanta 1999-03-31 2016-03-30
Mick New York 1980-01-20 2002-09-10
Tom Seatle 2002-03-15 1970-01-01
Donald Atlanta 1999-04-01 2016-03-31
Mick New York 1980-01-20 2002-09-11
Tom Seatle 2002-03-15 NULL
DROP TABLE t3;
#
# Testing JDBC join operations
@@ -280,3 +281,4 @@ DROP TABLE t1;
DROP TABLE connect.tx1;
DROP DATABASE connect;
SET GLOBAL time_zone=SYSTEM;
SET time_zone=SYSTEM;

View File

@@ -2,7 +2,8 @@ connect master,127.0.0.1,root,,test,$MASTER_MYPORT,;
connect slave,127.0.0.1,root,,test,$SLAVE_MYPORT,;
connection master;
connection slave;
SET GLOBAL time_zone='+1:00';
SET GLOBAL time_zone='+0:00';
SET time_zone='+0:00';
CREATE TABLE t1 (a int, b char(10));
INSERT INTO t1 VALUES (NULL,NULL),(0,'test00'),(1,'test01'),(2,'test02'),(3,'test03');
SELECT * FROM t1;
@@ -16,31 +17,32 @@ NULL NULL
# Testing errors
#
connection master;
SET GLOBAL time_zone='+1:00';
SET GLOBAL time_zone='+0:00';
SET time_zone='+0:00';
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=unknown';
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=unknown&useSSL=false';
ERROR HY000: Connecting: java.sql.SQLException: Access denied for user 'unknown'@'localhost' (using password: NO) rc=-2
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/unknown?user=root';
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/unknown?user=root&useSSL=false';
ERROR HY000: Connecting: java.sql.SQLSyntaxErrorException: Unknown database 'unknown' rc=-2
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME='unknown'
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root';
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false';
ERROR HY000: Cannot get columns from unknown
SHOW CREATE TABLE t1;
ERROR 42S02: Table 'test.t1' doesn't exist
CREATE TABLE t1 (x int, y char(10)) ENGINE=CONNECT TABLE_TYPE=JDBC
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root';
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false';
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`x` int(11) DEFAULT NULL,
`y` char(10) DEFAULT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root' `TABLE_TYPE`=JDBC
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false' `TABLE_TYPE`=JDBC
SELECT * FROM t1;
ERROR HY000: Got error 174 'ExecuteQuery: java.sql.SQLSyntaxErrorException: Unknown column 'x' in 'field list'' from CONNECT
DROP TABLE t1;
CREATE TABLE t1 (a int, b char(10)) ENGINE=CONNECT TABLE_TYPE=JDBC
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root';
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false';
connection slave;
ALTER TABLE t1 RENAME t1backup;
connection master;
@@ -54,13 +56,13 @@ DROP TABLE t1;
# Testing SELECT, etc.
#
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root';
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false';
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(10) DEFAULT NULL,
`b` char(10) DEFAULT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root' `TABLE_TYPE`='JDBC'
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false' `TABLE_TYPE`='JDBC'
SELECT * FROM t1;
a b
NULL NULL
@@ -70,13 +72,13 @@ NULL NULL
3 test03
DROP TABLE t1;
CREATE TABLE t1 (a int, b char(10)) ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME='t1'
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root';
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false';
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) DEFAULT NULL,
`b` char(10) DEFAULT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root' `TABLE_TYPE`=JDBC `TABNAME`='t1'
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false' `TABLE_TYPE`=JDBC `TABNAME`='t1'
SELECT * FROM t1;
a b
NULL NULL
@@ -86,13 +88,13 @@ NULL NULL
3 test03
DROP TABLE t1;
CREATE TABLE t1 (a INT NOT NULL, b CHAR(10) NOT NULL) ENGINE=CONNECT TABLE_TYPE=JDBC
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root';
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false';
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` int(11) NOT NULL,
`b` char(10) NOT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root' `TABLE_TYPE`=JDBC
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false' `TABLE_TYPE`=JDBC
SELECT * FROM t1;
a b
0
@@ -102,13 +104,13 @@ a b
3 test03
DROP TABLE t1;
CREATE TABLE t1 (a char(10), b int) ENGINE=CONNECT TABLE_TYPE=JDBC
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root';
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false';
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` char(10) DEFAULT NULL,
`b` int(11) DEFAULT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root' `TABLE_TYPE`=JDBC
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false' `TABLE_TYPE`=JDBC
SELECT * FROM t1;
a b
NULL NULL
@@ -138,7 +140,7 @@ t1 CREATE TABLE `t1` (
INSERT INTO t1 VALUES(100,3333,41235,1234567890,235000000000,3.14159265,3.14159265,3141.59265);
connection master;
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root';
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false';
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
@@ -150,7 +152,7 @@ t1 CREATE TABLE `t1` (
`f` double(14,0) DEFAULT NULL,
`g` double(24,0) DEFAULT NULL,
`h` decimal(27,5) DEFAULT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root' `TABLE_TYPE`='JDBC'
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false' `TABLE_TYPE`='JDBC'
SELECT * FROM t1;
a b c d e f g h
100 3333 41235 1234567890 235000000000 3 3 3141.59265
@@ -173,13 +175,13 @@ a b
Welcome Hello, World
connection master;
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root';
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false';
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`a` char(12) DEFAULT NULL,
`b` varchar(12) DEFAULT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root' `TABLE_TYPE`='JDBC'
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false' `TABLE_TYPE`='JDBC'
SELECT * FROM t1;
a b
Welcome Hello, World
@@ -209,7 +211,7 @@ a b c d e
2003-05-27 2003-05-27 10:45:23 10:45:23 2003-05-27 10:45:23 2003
connection master;
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root';
CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false';
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
@@ -218,13 +220,15 @@ t1 CREATE TABLE `t1` (
`c` time DEFAULT NULL,
`d` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
`e` year(4) DEFAULT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root' `TABLE_TYPE`='JDBC'
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='jdbc:mysql://127.0.0.1:SLAVE_PORT/test?user=root&useSSL=false' `TABLE_TYPE`='JDBC'
SELECT * FROM t1;
a b c d e
2003-05-27 2003-05-27 11:45:23 10:45:23 2003-05-27 10:45:23 2003
2003-05-27 2003-05-27 10:45:23 10:45:23 2003-05-27 10:45:23 2003
DROP TABLE t1;
connection slave;
DROP TABLE t1;
SET GLOBAL time_zone=SYSTEM;
SET time_zone=SYSTEM;
connection master;
SET GLOBAL time_zone=SYSTEM;
SET time_zone=SYSTEM;

View File

@@ -3,7 +3,7 @@ command varchar(128) not null,
number int(5) not null flag=1,
message varchar(255) flag=2)
ENGINE=CONNECT TABLE_TYPE=JDBC CONNECTION='jdbc:oracle:thin:@localhost:1521:xe'
OPTION_LIST='User=system,Password=Choupy01,Execsrc=1';
OPTION_LIST='User=system,Password=Biscote01,Execsrc=1';
SELECT * FROM t2 WHERE command = 'drop table employee';
command number message
drop table employee 0 Execute: java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist
@@ -23,14 +23,14 @@ Warnings:
Warning 1105 Affected rows
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC CATFUNC=tables
CONNECTION='jdbc:oracle:thin:@localhost:1521:xe'
OPTION_LIST='User=system,Password=Choupy01';
OPTION_LIST='User=system,Password=Biscote01';
SELECT * FROM t1 WHERE table_name='employee';
Table_Cat Table_Schema Table_Name Table_Type Remark
NULL SYSTEM EMPLOYEE TABLE NULL
DROP TABLE t1;
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME='EMPLOYEE' CATFUNC=columns
CONNECTION='jdbc:oracle:thin:@localhost:1521:xe'
OPTION_LIST='User=system,Password=Choupy01';
OPTION_LIST='User=system,Password=Biscote01';
SELECT * FROM t1;
Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks
NULL SYSTEM EMPLOYEE ID 3 NUMBER 38 0 0 10 0 NULL
@@ -42,7 +42,7 @@ CREATE SERVER 'oracle' FOREIGN DATA WRAPPER 'oracle.jdbc.driver.OracleDriver' OP
HOST 'jdbc:oracle:thin:@localhost:1521:xe',
DATABASE 'SYSTEM',
USER 'system',
PASSWORD 'Choupy01',
PASSWORD 'Biscote01',
PORT 0,
SOCKET '',
OWNER 'SYSTEM');

View File

@@ -10,7 +10,7 @@ SELECT * from t1 limit 3;
Document
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51c"},"address":{"building":"1007","coord":[-73.856077,40.848447],"street":"Morris Park Ave","zipcode":"10462"},"borough":"Bronx","cuisine":"Bakery","grades":[{"date":{"$date":"2014-03-03T00:00:00.000Z"},"grade":"A","score":2},{"date":{"$date":"2013-09-11T00:00:00.000Z"},"grade":"A","score":6},{"date":{"$date":"2013-01-24T00:00:00.000Z"},"grade":"A","score":10},{"date":{"$date":"2011-11-23T00:00:00.000Z"},"grade":"A","score":9},{"date":{"$date":"2011-03-10T00:00:00.000Z"},"grade":"B","score":14}],"name":"Morris Park Bake Shop","restaurant_id":"30075445"}
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51d"},"address":{"building":"469","coord":[-73.961704,40.662942],"street":"Flatbush Avenue","zipcode":"11225"},"borough":"Brooklyn","cuisine":"Hamburgers","grades":[{"date":{"$date":"2014-12-30T00:00:00.000Z"},"grade":"A","score":8},{"date":{"$date":"2014-07-01T00:00:00.000Z"},"grade":"B","score":23},{"date":{"$date":"2013-04-30T00:00:00.000Z"},"grade":"A","score":12},{"date":{"$date":"2012-05-08T00:00:00.000Z"},"grade":"A","score":12}],"name":"Wendy'S","restaurant_id":"30112340"}
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.98513559999999,40.7676919],"street":"West 57 Street","zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":"2014-09-06T00:00:00.000Z"},"grade":"A","score":2},{"date":{"$date":"2013-07-22T00:00:00.000Z"},"grade":"A","score":11},{"date":{"$date":"2012-07-31T00:00:00.000Z"},"grade":"A","score":12},{"date":{"$date":"2011-12-29T00:00:00.000Z"},"grade":"A","score":12}],"name":"Dj Reynolds Pub And Restaurant","restaurant_id":"30191841"}
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.985136,40.767692],"street":"West 57 Street","zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":"2014-09-06T00:00:00.000Z"},"grade":"A","score":2},{"date":{"$date":"2013-07-22T00:00:00.000Z"},"grade":"A","score":11},{"date":{"$date":"2012-07-31T00:00:00.000Z"},"grade":"A","score":12},{"date":{"$date":"2011-12-29T00:00:00.000Z"},"grade":"A","score":12}],"name":"Dj Reynolds Pub And Restaurant","restaurant_id":"30191841"}
DROP TABLE t1;
#
# Test catfunc

View File

@@ -10,7 +10,7 @@ SELECT * from t1 limit 3;
Document
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51c"},"address":{"building":"1007","coord":[-73.856077,40.848447],"street":"Morris Park Ave","zipcode":"10462"},"borough":"Bronx","cuisine":"Bakery","grades":[{"date":{"$date":1393804800000},"grade":"A","score":2},{"date":{"$date":1378857600000},"grade":"A","score":6},{"date":{"$date":1358985600000},"grade":"A","score":10},{"date":{"$date":1322006400000},"grade":"A","score":9},{"date":{"$date":1299715200000},"grade":"B","score":14}],"name":"Morris Park Bake Shop","restaurant_id":"30075445"}
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51d"},"address":{"building":"469","coord":[-73.961704,40.662942],"street":"Flatbush Avenue","zipcode":"11225"},"borough":"Brooklyn","cuisine":"Hamburgers","grades":[{"date":{"$date":1419897600000},"grade":"A","score":8},{"date":{"$date":1404172800000},"grade":"B","score":23},{"date":{"$date":1367280000000},"grade":"A","score":12},{"date":{"$date":1336435200000},"grade":"A","score":12}],"name":"Wendy'S","restaurant_id":"30112340"}
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.98513559999999,40.7676919],"street":"West 57 Street","zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":1409961600000},"grade":"A","score":2},{"date":{"$date":1374451200000},"grade":"A","score":11},{"date":{"$date":1343692800000},"grade":"A","score":12},{"date":{"$date":1325116800000},"grade":"A","score":12}],"name":"Dj Reynolds Pub And Restaurant","restaurant_id":"30191841"}
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.985136,40.767692],"street":"West 57 Street","zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":1409961600000},"grade":"A","score":2},{"date":{"$date":1374451200000},"grade":"A","score":11},{"date":{"$date":1343692800000},"grade":"A","score":12},{"date":{"$date":1325116800000},"grade":"A","score":12}],"name":"Dj Reynolds Pub And Restaurant","restaurant_id":"30191841"}
DROP TABLE t1;
#
# Test catfunc

View File

@@ -8,9 +8,9 @@ ENGINE=CONNECT TABLE_TYPE=JSON TABNAME=restaurants CONNECTION='mongodb://localho
OPTION_LIST='Driver=C,Version=0' DATA_CHARSET=utf8;
SELECT * from t1 limit 3;
Document
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51c"},"address":{"building":"1007","coord":[-73.856076999999999089,40.848447000000000173],"street":"Morris Park Ave","zipcode":"10462"},"borough":"Bronx","cuisine":"Bakery","grades":[{"date":{"$date":1393804800000},"grade":"A","score":2},{"date":{"$date":1378857600000},"grade":"A","score":6},{"date":{"$date":1358985600000},"grade":"A","score":10},{"date":{"$date":1322006400000},"grade":"A","score":9},{"date":{"$date":1299715200000},"grade":"B","score":14}],"name":"Morris Park Bake Shop","restaurant_id":"30075445"}
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51d"},"address":{"building":"469","coord":[-73.96170399999999745,40.66294200000000103],"street":"Flatbush Avenue","zipcode":"11225"},"borough":"Brooklyn","cuisine":"Hamburgers","grades":[{"date":{"$date":1419897600000},"grade":"A","score":8},{"date":{"$date":1404172800000},"grade":"B","score":23},{"date":{"$date":1367280000000},"grade":"A","score":12},{"date":{"$date":1336435200000},"grade":"A","score":12}],"name":"Wendy'S","restaurant_id":"30112340"}
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.985135599999992451,40.767691900000002647],"street":"West 57 Street","zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":1409961600000},"grade":"A","score":2},{"date":{"$date":1374451200000},"grade":"A","score":11},{"date":{"$date":1343692800000},"grade":"A","score":12},{"date":{"$date":1325116800000},"grade":"A","score":12}],"name":"Dj Reynolds Pub And Restaurant","restaurant_id":"30191841"}
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51c"},"address":{"building":"1007","coord":[-73.856077,40.848447],"street":"Morris Park Ave","zipcode":"10462"},"borough":"Bronx","cuisine":"Bakery","grades":[{"date":{"$date":1393804800000},"grade":"A","score":2},{"date":{"$date":1378857600000},"grade":"A","score":6},{"date":{"$date":1358985600000},"grade":"A","score":10},{"date":{"$date":1322006400000},"grade":"A","score":9},{"date":{"$date":1299715200000},"grade":"B","score":14}],"name":"Morris Park Bake Shop","restaurant_id":"30075445"}
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51d"},"address":{"building":"469","coord":[-73.961704,40.662942],"street":"Flatbush Avenue","zipcode":"11225"},"borough":"Brooklyn","cuisine":"Hamburgers","grades":[{"date":{"$date":1419897600000},"grade":"A","score":8},{"date":{"$date":1404172800000},"grade":"B","score":23},{"date":{"$date":1367280000000},"grade":"A","score":12},{"date":{"$date":1336435200000},"grade":"A","score":12}],"name":"Wendy'S","restaurant_id":"30112340"}
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.985136,40.767692],"street":"West 57 Street","zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":1409961600000},"grade":"A","score":2},{"date":{"$date":1374451200000},"grade":"A","score":11},{"date":{"$date":1343692800000},"grade":"A","score":12},{"date":{"$date":1325116800000},"grade":"A","score":12}],"name":"Dj Reynolds Pub And Restaurant","restaurant_id":"30191841"}
DROP TABLE t1;
#
# Test catfunc
@@ -363,7 +363,7 @@ _id item prices_0 prices_1 prices_2 prices_3 prices_4
1 journal 87 45 63 12 78
2 notebook 123 456 789 NULL NULL
3 paper 5 7 3 8 NULL
4 planner 25 71 44 27 NULL
4 planner 25 71 NULL 44 27
5 postcard 5 7 3 8 NULL
DROP TABLE t1;
#

View File

@@ -8,9 +8,9 @@ ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants
OPTION_LIST='Driver=C,Version=0' DATA_CHARSET=utf8;
SELECT * from t1 limit 3;
Document
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51c"},"address":{"building":"1007","coord":[-73.856076999999999089,40.848447000000000173],"street":"Morris ParkAve", "zipcode":"10462"},"borough":"Bronx","cuisine":"Bakery","grades":[{"date":{"$date":1393804800000},"grade":"A","score":2},{"date":{"$date":1378857600000},"grade":"A","score":6},{"date":{"$date":1358985600000},"grade":"A","score":10},{"date":{"$date":1322006400000},"grade":"A","score":9},{"date":{"$date":1299715200000},"grade":"B","score":14}],"name":"Morris ParkBakeShop", "restaurant_id":"30075445"}
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51d"},"address":{"building":"469","coord":[-73.96170399999999745,40.66294200000000103],"street":"Flatbush Avenue", "zipcode":"11225"},"borough":"Brooklyn","cuisine":"Hamburgers","grades":[{"date":{"$date":1419897600000},"grade":"A","score":8},{"date":{"$date":1404172800000},"grade":"B","score":23},{"date":{"$date":1367280000000},"grade":"A","score":12},{"date":{"$date":1336435200000},"grade":"A","score":12}],"name":"Wendy'S","restaurant_id":"30112340"}
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.985135599999992451,40.767691900000002647],"street":"West 57Street", "zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":1409961600000},"grade":"A","score":2},{"date":{"$date":1374451200000},"grade":"A","score":11},{"date":{"$date":1343692800000},"grade":"A","score":12},{"date":{"$date":1325116800000},"grade":"A","score":12}],"name":"Dj ReynoldsPubAndRestaurant", "restaurant_id":"30191841"}
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51c"},"address":{"building":"1007","coord":[-73.856077,40.848447],"street":"Morris Park Ave","zipcode":"10462"},"borough":"Bronx","cuisine":"Bakery","grades":[{"date":{"$date":1393804800000.000000},"grade":"A","score":2},{"date":{"$date":1378857600000.000000},"grade":"A","score":6},{"date":{"$date":1358985600000.000000},"grade":"A","score":10},{"date":{"$date":1322006400000.000000},"grade":"A","score":9},{"date":{"$date":1299715200000.000000},"grade":"B","score":14}],"name":"Morris Park Bake Shop","restaurant_id":"30075445"}
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51d"},"address":{"building":"469","coord":[-73.961704,40.662942],"street":"Flatbush Avenue","zipcode":"11225"},"borough":"Brooklyn","cuisine":"Hamburgers","grades":[{"date":{"$date":1419897600000.000000},"grade":"A","score":8},{"date":{"$date":1404172800000.000000},"grade":"B","score":23},{"date":{"$date":1367280000000.000000},"grade":"A","score":12},{"date":{"$date":1336435200000.000000},"grade":"A","score":12}],"name":"Wendy'S","restaurant_id":"30112340"}
{"_id":{"$oid":"58ada47de5a51ddfcd5ed51e"},"address":{"building":"351","coord":[-73.985136,40.767692],"street":"West 57 Street","zipcode":"10019"},"borough":"Manhattan","cuisine":"Irish","grades":[{"date":{"$date":1409961600000.000000},"grade":"A","score":2},{"date":{"$date":1374451200000.000000},"grade":"A","score":11},{"date":{"$date":1343692800000.000000},"grade":"A","score":12},{"date":{"$date":1325116800000.000000},"grade":"A","score":12}],"name":"Dj Reynolds Pub And Restaurant","restaurant_id":"30191841"}
DROP TABLE t1;
#
# Test catfunc
@@ -64,23 +64,23 @@ SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`_id` char(24) NOT NULL,
`address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building',
`address_coord` varchar(512) NOT NULL `FIELD_FORMAT`='address.coord',
`address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street',
`address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode',
`address_building` char(10) NOT NULL `JPATH`='address.building',
`address_coord` varchar(512) NOT NULL `JPATH`='address.coord',
`address_street` char(38) NOT NULL `JPATH`='address.street',
`address_zipcode` char(5) NOT NULL `JPATH`='address.zipcode',
`borough` char(13) NOT NULL,
`cuisine` char(64) NOT NULL,
`grades_0` varchar(512) DEFAULT NULL `FIELD_FORMAT`='grades.0',
`grades_0` varchar(512) DEFAULT NULL `JPATH`='grades.0',
`name` char(98) NOT NULL,
`restaurant_id` char(8) NOT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `OPTION_LIST`='Depth=1,Driver=C,Version=0' `DATA_CHARSET`='utf8'
SELECT * FROM t1 LIMIT 5;
_id address_building address_coord address_street address_zipcode borough cuisine grades_0 name restaurant_id
58ada47de5a51ddfcd5ed51c 1007 Morris Park Ave 10462 Bronx Bakery {"date":{"$date":1393804800000},"grade":"A","score":2} Morris Park Bake Shop 30075445
58ada47de5a51ddfcd5ed51d 469 Flatbush Avenue 11225 Brooklyn Hamburgers {"date":{"$date":1419897600000},"grade":"A","score":8} Wendy'S 30112340
58ada47de5a51ddfcd5ed51e 351 West 57 Street 10019 Manhattan Irish {"date":{"$date":1409961600000},"grade":"A","score":2} Dj Reynolds Pub And Restaurant 30191841
58ada47de5a51ddfcd5ed51f 2780 Stillwell Avenue 11224 Brooklyn American {"date":{"$date":1402358400000},"grade":"A","score":5} Riviera Caterer 40356018
58ada47de5a51ddfcd5ed520 97-22 63 Road 11374 Queens Jewish/Kosher {"date":{"$date":1416787200000},"grade":"Z","score":20} Tov Kosher Kitchen 40356068
58ada47de5a51ddfcd5ed51c 1007 [-73.856077,40.848447] Morris Park Ave 10462 Bronx Bakery {"date":{"$date":1393804800000},"grade":"A","score":2} Morris Park Bake Shop 30075445
58ada47de5a51ddfcd5ed51d 469 [-73.961704,40.662942] Flatbush Avenue 11225 Brooklyn Hamburgers {"date":{"$date":1419897600000},"grade":"A","score":8} Wendy'S 30112340
58ada47de5a51ddfcd5ed51e 351 [-73.985136,40.767692] West 57 Street 10019 Manhattan Irish {"date":{"$date":1409961600000},"grade":"A","score":2} Dj Reynolds Pub And Restaurant 30191841
58ada47de5a51ddfcd5ed51f 2780 [-73.982420,40.579505] Stillwell Avenue 11224 Brooklyn American {"date":{"$date":1402358400000},"grade":"A","score":5} Riviera Caterer 40356018
58ada47de5a51ddfcd5ed520 97-22 [-73.860115,40.731174] 63 Road 11374 Queens Jewish/Kosher {"date":{"$date":1416787200000},"grade":"Z","score":20} Tov Kosher Kitchen 40356068
DROP TABLE t1;
#
# Dropping a column
@@ -89,16 +89,16 @@ CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=MONGO TABNAME=restaurants DATA_CHARSET
COLIST='{"projection":{"grades":0}}' OPTION_LIST='Driver=C,Version=0,level=0' ;
SELECT * FROM t1 LIMIT 10;
_id address borough cuisine name restaurant_id
58ada47de5a51ddfcd5ed51c {"building":"1007","coord":[-73.856076999999999089,40.848447000000000173],"street":"Morris ParkAve", "zipcode":"10462"} Bronx Bakery Morris Park Bake Shop 30075445
58ada47de5a51ddfcd5ed51d {"building":"469","coord":[-73.96170399999999745,40.66294200000000103],"street":"Flatbush Avenue", "zipcode":"11225"} Brooklyn Hamburgers Wendy'S 30112340
58ada47de5a51ddfcd5ed51e {"building":"351","coord":[-73.985135599999992451,40.767691900000002647],"street":"West 57Street", "zipcode":"10019"} Manhattan Irish Dj Reynolds Pub And Restaurant 30191841
58ada47de5a51ddfcd5ed51f {"building":"2780","coord":[-73.982419999999990523,40.579504999999997494],"street":"Stillwell Avenue", "zipcode":"11224"} Brooklyn American Riviera Caterer 40356018
58ada47de5a51ddfcd5ed520 {"building":"97-22","coord":[-73.860115199999995639,40.731173900000001709],"street":"63 Road", "zipcode":"11374"} Queens Jewish/Kosher Tov Kosher Kitchen 40356068
58ada47de5a51ddfcd5ed521 {"building":"8825","coord":[-73.880382699999998408,40.764312400000001446],"street":"Astoria Boulevard", "zipcode":"11369"} Queens American Brunos On The Boulevard 40356151
58ada47de5a51ddfcd5ed522 {"building":"2206","coord":[-74.137728600000002643,40.611957199999999091],"street":"Victory Boulevard", "zipcode":"10314"} Staten Island Jewish/Kosher Kosher Island 40356442
58ada47de5a51ddfcd5ed523 {"building":"7114","coord":[-73.906850599999998508,40.619903399999998328],"street":"Avenue U", "zipcode":"11234"} Brooklyn Delicatessen Wilken'S Fine Food 40356483
58ada47de5a51ddfcd5ed524 {"building":"6409","coord":[-74.005288999999990551,40.628886000000001388],"street":"11 Avenue", "zipcode":"11219"} Brooklyn American Regina Caterers 40356649
58ada47de5a51ddfcd5ed525 {"building":"1839","coord":[-73.948260899999993967,40.640827100000002758],"street":"Nostrand Avenue", "zipcode":"11226"} Brooklyn Ice Cream, Gelato, Yogurt, Ices Taste The Tropics Ice Cream 40356731
58ada47de5a51ddfcd5ed51c {"building":"1007","coord":[-73.856077,40.848447],"street":"Morris Park Ave","zipcode":"10462"} Bronx Bakery Morris Park Bake Shop 30075445
58ada47de5a51ddfcd5ed51d {"building":"469","coord":[-73.961704,40.662942],"street":"Flatbush Avenue","zipcode":"11225"} Brooklyn Hamburgers Wendy'S 30112340
58ada47de5a51ddfcd5ed51e {"building":"351","coord":[-73.985136,40.767692],"street":"West 57 Street","zipcode":"10019"} Manhattan Irish Dj Reynolds Pub And Restaurant 30191841
58ada47de5a51ddfcd5ed51f {"building":"2780","coord":[-73.982420,40.579505],"street":"Stillwell Avenue","zipcode":"11224"} Brooklyn American Riviera Caterer 40356018
58ada47de5a51ddfcd5ed520 {"building":"97-22","coord":[-73.860115,40.731174],"street":"63 Road","zipcode":"11374"} Queens Jewish/Kosher Tov Kosher Kitchen 40356068
58ada47de5a51ddfcd5ed521 {"building":"8825","coord":[-73.880383,40.764312],"street":"Astoria Boulevard","zipcode":"11369"} Queens American Brunos On The Boulevard 40356151
58ada47de5a51ddfcd5ed522 {"building":"2206","coord":[-74.137729,40.611957],"street":"Victory Boulevard","zipcode":"10314"} Staten Island Jewish/Kosher Kosher Island 40356442
58ada47de5a51ddfcd5ed523 {"building":"7114","coord":[-73.906851,40.619903],"street":"Avenue U","zipcode":"11234"} Brooklyn Delicatessen Wilken'S Fine Food 40356483
58ada47de5a51ddfcd5ed524 {"building":"6409","coord":[-74.005289,40.628886],"street":"11 Avenue","zipcode":"11219"} Brooklyn American Regina Caterers 40356649
58ada47de5a51ddfcd5ed525 {"building":"1839","coord":[-73.948261,40.640827],"street":"Nostrand Avenue","zipcode":"11226"} Brooklyn Ice Cream, Gelato, Yogurt, Ices Taste The Tropics Ice Cream 40356731
DROP TABLE t1;
#
# Specifying Jpath
@@ -249,14 +249,14 @@ SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`_id` char(24) NOT NULL,
`address_building` char(6) NOT NULL `FIELD_FORMAT`='address.building',
`address_coord_0` double(12,6) NOT NULL `FIELD_FORMAT`='address.coord.0',
`address_street` char(25) NOT NULL `FIELD_FORMAT`='address.street',
`address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode',
`address_building` char(6) NOT NULL `JPATH`='address.building',
`address_coord_0` double(12,6) NOT NULL `JPATH`='address.coord.0',
`address_street` char(25) NOT NULL `JPATH`='address.street',
`address_zipcode` char(5) NOT NULL `JPATH`='address.zipcode',
`borough` char(13) NOT NULL,
`grades_0_date` datetime NOT NULL `FIELD_FORMAT`='grades.0.date',
`grades_0_grade` char(14) NOT NULL `FIELD_FORMAT`='grades.0.grade',
`grades_0_score` int(11) NOT NULL `FIELD_FORMAT`='grades.0.score',
`grades_0_date` datetime NOT NULL `JPATH`='grades.0.date',
`grades_0_grade` char(14) NOT NULL `JPATH`='grades.0.grade',
`grades_0_score` int(11) NOT NULL `JPATH`='grades.0.score',
`name` char(32) NOT NULL,
`restaurant_id` char(8) NOT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `COLIST`='{"projection":{"cuisine":0}}' `FILTER`='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' `OPTION_LIST`='Driver=C,level=2,version=0'

View File

@@ -64,13 +64,13 @@ SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`_id` char(24) NOT NULL,
`address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building',
`address_coord` char(41) NOT NULL `FIELD_FORMAT`='address.coord',
`address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street',
`address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode',
`address_building` char(10) NOT NULL `JPATH`='address.building',
`address_coord` char(41) NOT NULL `JPATH`='address.coord',
`address_street` char(38) NOT NULL `JPATH`='address.street',
`address_zipcode` char(5) NOT NULL `JPATH`='address.zipcode',
`borough` char(13) NOT NULL,
`cuisine` char(64) NOT NULL,
`grades_0` char(99) DEFAULT NULL `FIELD_FORMAT`='grades.0',
`grades_0` char(99) DEFAULT NULL `JPATH`='grades.0',
`name` char(98) NOT NULL,
`restaurant_id` char(8) NOT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `OPTION_LIST`='Depth=1,Driver=Java,Version=2' `DATA_CHARSET`='utf8'
@@ -249,14 +249,14 @@ SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`_id` char(24) NOT NULL,
`address_building` char(6) NOT NULL `FIELD_FORMAT`='address.building',
`address_coord_0` double(18,14) NOT NULL `FIELD_FORMAT`='address.coord.0',
`address_street` char(25) NOT NULL `FIELD_FORMAT`='address.street',
`address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode',
`address_building` char(6) NOT NULL `JPATH`='address.building',
`address_coord_0` double(18,14) NOT NULL `JPATH`='address.coord.0',
`address_street` char(25) NOT NULL `JPATH`='address.street',
`address_zipcode` char(5) NOT NULL `JPATH`='address.zipcode',
`borough` char(13) NOT NULL,
`grades_0_date` datetime NOT NULL `FIELD_FORMAT`='grades.0.date',
`grades_0_grade` char(14) NOT NULL `FIELD_FORMAT`='grades.0.grade',
`grades_0_score` int(2) NOT NULL `FIELD_FORMAT`='grades.0.score',
`grades_0_date` datetime NOT NULL `JPATH`='grades.0.date',
`grades_0_grade` char(14) NOT NULL `JPATH`='grades.0.grade',
`grades_0_score` int(2) NOT NULL `JPATH`='grades.0.score',
`name` char(32) NOT NULL,
`restaurant_id` char(8) NOT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `COLIST`='{"cuisine":0}' `FILTER`='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' `OPTION_LIST`='Driver=Java,level=2,version=2'

View File

@@ -64,13 +64,13 @@ SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`_id` char(24) NOT NULL,
`address_building` char(10) NOT NULL `FIELD_FORMAT`='address.building',
`address_coord` char(39) NOT NULL `FIELD_FORMAT`='address.coord',
`address_street` char(38) NOT NULL `FIELD_FORMAT`='address.street',
`address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode',
`address_building` char(10) NOT NULL `JPATH`='address.building',
`address_coord` char(39) NOT NULL `JPATH`='address.coord',
`address_street` char(38) NOT NULL `JPATH`='address.street',
`address_zipcode` char(5) NOT NULL `JPATH`='address.zipcode',
`borough` char(13) NOT NULL,
`cuisine` char(64) NOT NULL,
`grades_0` char(84) DEFAULT NULL `FIELD_FORMAT`='grades.0',
`grades_0` char(84) DEFAULT NULL `JPATH`='grades.0',
`name` char(98) NOT NULL,
`restaurant_id` char(8) NOT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `OPTION_LIST`='Depth=1,Driver=Java,Version=3' `DATA_CHARSET`='utf8'
@@ -249,14 +249,14 @@ SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`_id` char(24) NOT NULL,
`address_building` char(6) NOT NULL `FIELD_FORMAT`='address.building',
`address_coord_0` double(18,14) NOT NULL `FIELD_FORMAT`='address.coord.0',
`address_street` char(25) NOT NULL `FIELD_FORMAT`='address.street',
`address_zipcode` char(5) NOT NULL `FIELD_FORMAT`='address.zipcode',
`address_building` char(6) NOT NULL `JPATH`='address.building',
`address_coord_0` double(18,14) NOT NULL `JPATH`='address.coord.0',
`address_street` char(25) NOT NULL `JPATH`='address.street',
`address_zipcode` char(5) NOT NULL `JPATH`='address.zipcode',
`borough` char(13) NOT NULL,
`grades_0_date` datetime NOT NULL `FIELD_FORMAT`='grades.0.date',
`grades_0_grade` char(14) NOT NULL `FIELD_FORMAT`='grades.0.grade',
`grades_0_score` int(2) NOT NULL `FIELD_FORMAT`='grades.0.score',
`grades_0_date` datetime NOT NULL `JPATH`='grades.0.date',
`grades_0_grade` char(14) NOT NULL `JPATH`='grades.0.grade',
`grades_0_score` int(2) NOT NULL `JPATH`='grades.0.score',
`name` char(32) NOT NULL,
`restaurant_id` char(8) NOT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 `TABLE_TYPE`='MONGO' `TABNAME`='restaurants' `COLIST`='{"cuisine":0}' `FILTER`='{"cuisine":"French","borough":{"$ne":"Manhattan"}}' `OPTION_LIST`='Driver=Java,level=2,version=3'

View File

@@ -10,7 +10,7 @@ SET NAMES utf8;
# All tables in all schemas (filtered with WHERE)
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
CATFUNC=Tables;
SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name;
Table_Cat Table_Schema Table_Name Table_Type Remark
@@ -20,7 +20,7 @@ NULL MTR V1 VIEW NULL
DROP TABLE t1;
# All tables in all schemas (filtered with WHERE)
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
CATFUNC=Tables TABNAME='%.%';
SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name;
Table_Cat Table_Schema Table_Name Table_Type Remark
@@ -30,7 +30,7 @@ NULL MTR V1 VIEW NULL
DROP TABLE t1;
# All tables "T1" in all schemas (filtered with WHERE)
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
CATFUNC=Tables TABNAME='%.T1';
SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name;
Table_Cat Table_Schema Table_Name Table_Type Remark
@@ -38,7 +38,7 @@ NULL MTR T1 TABLE NULL
DROP TABLE t1;
# All tables "T1" in all schemas (filtered with WHERE)
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
CATFUNC=Tables TABNAME='T1';
SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name;
Table_Cat Table_Schema Table_Name Table_Type Remark
@@ -46,7 +46,7 @@ NULL MTR T1 TABLE NULL
DROP TABLE t1;
# Table "T1" in the schema "MTR"
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
CATFUNC=Tables TABNAME='MTR.T1';
SELECT * FROM t1 ORDER BY Table_Schema, Table_Name;
Table_Cat Table_Schema Table_Name Table_Type Remark
@@ -54,7 +54,7 @@ NULL MTR T1 TABLE NULL
DROP TABLE t1;
# All tables in the schema "MTR"
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
CATFUNC=Tables TABNAME='MTR.%';
SELECT * FROM t1 ORDER BY Table_Schema, Table_Name;
Table_Cat Table_Schema Table_Name Table_Type Remark
@@ -68,7 +68,7 @@ DROP TABLE t1;
# All columns in all schemas (limited with WHERE)
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
CATFUNC=Columns;
SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name;
Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks
@@ -80,7 +80,7 @@ Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Bu
DROP TABLE t1;
# All columns in all schemas (limited with WHERE)
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
CATFUNC=Columns TABNAME='%.%';
SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name;
Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks
@@ -91,7 +91,7 @@ Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Bu
MTR V1 B 6 NUMBER 38 40 NULL NULL 1
DROP TABLE t1;
# All tables "T1" in all schemas (limited with WHERE)
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' CATFUNC=Columns TABNAME='%.T1';
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Columns TABNAME='%.T1';
SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name;
Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks
MTR T1 A 3 DECIMAL 38 40 0 10 1
@@ -99,7 +99,7 @@ Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Bu
DROP TABLE t1;
# Table "T1" in the schema "MTR"
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
CATFUNC=Columns TABNAME='MTR.T1';
SELECT * FROM t1 ORDER BY Table_Schema, Table_Name;
Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks
@@ -108,7 +108,7 @@ Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Bu
DROP TABLE t1;
# All tables "T1" in all schemas (filtered with WHERE)
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
CATFUNC=Columns TABNAME='%.T1';
SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name;
Table_Cat Table_Schema Table_Name Column_Name Data_Type Type_Name Column_Size Buffer_Length Decimal_Digits Radix Nullable Remarks
@@ -121,14 +121,14 @@ DROP TABLE t1;
# Table "T1" in the default schema ("MTR")
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
TABNAME='T1';
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`A` decimal(40,0) DEFAULT NULL,
`B` double DEFAULT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' `TABLE_TYPE`='ODBC' `TABNAME`='T1'
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' `TABLE_TYPE`='ODBC' `TABNAME`='T1'
SELECT * FROM t1 ORDER BY A;
A B
10 1000000000
@@ -157,14 +157,14 @@ DROP VIEW v1;
DROP TABLE t1;
# Table "T1" in the schema "MTR"
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
TABNAME='MTR.T1';
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`A` decimal(40,0) DEFAULT NULL,
`B` double DEFAULT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' `TABLE_TYPE`='ODBC' `TABNAME`='MTR.T1'
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' `TABLE_TYPE`='ODBC' `TABNAME`='MTR.T1'
SELECT * FROM t1;
A B
10 1000000000
@@ -173,14 +173,14 @@ A B
DROP TABLE t1;
# View "V1" in the schema "MTR"
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
TABNAME='MTR.V1';
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`A` decimal(40,0) DEFAULT NULL,
`B` double DEFAULT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' `TABLE_TYPE`='ODBC' `TABNAME`='MTR.V1'
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' `TABLE_TYPE`='ODBC' `TABNAME`='MTR.V1'
SELECT * FROM t1;
A B
10 1000000000
@@ -209,13 +209,13 @@ DROP VIEW v1;
DROP TABLE t1;
# Table "T2" in the schema "MTR"
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
TABNAME='MTR.T2';
SHOW CREATE TABLE t1;
Table Create Table
t1 CREATE TABLE `t1` (
`A` varchar(64) DEFAULT NULL
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' `TABLE_TYPE`='ODBC' `TABNAME`='MTR.T2'
) ENGINE=CONNECT DEFAULT CHARSET=latin1 CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' `TABLE_TYPE`='ODBC' `TABNAME`='MTR.T2'
SELECT * FROM t1;
A
test

View File

@@ -1,6 +1,7 @@
-- source windows.inc
-- source jdbconn.inc
SET GLOBAL time_zone='+1:00';
SET GLOBAL time_zone='+0:00';
SET time_zone='+0:00';
let $MYSQLD_DATADIR= `select @@datadir`;
--copy_file $MTR_SUITE_DIR/std_data/girls.txt $MYSQLD_DATADIR/test/girls.txt
@@ -27,7 +28,7 @@ SELECT * FROM t2;
--echo #
USE test;
--replace_result $PORT PORT
--eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME=t2 CONNECTION='jdbc:mysql://localhost:$PORT/connect?user=root'
--eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME=t2 CONNECTION='jdbc:mysql://localhost:$PORT/connect?user=root&useSSL=false'
SELECT * FROM t1;
INSERT INTO t1 VALUES(786325481247, 'Hello!', '19:45:03', '1933-08-10', '1985-11-12 09:02:44', '2014-06-17 10:32:01');
SELECT * FROM t1;
@@ -39,7 +40,7 @@ DROP TABLE t1;
--echo # Testing JDBC view
--echo #
--replace_result $PORT PORT
--eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC SRCDEF='select id, msg, tm, dt from t2' CONNECTION='jdbc:mysql://localhost:$PORT/connect?user=root'
--eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC SRCDEF='select id, msg, tm, dt from t2' CONNECTION='jdbc:mysql://localhost:$PORT/connect?user=root&useSSL=false'
SELECT * FROM t1;
SELECT msg, dt FROM t1;
DROP TABLE t1, connect.t2;
@@ -67,7 +68,7 @@ INSERT INTO t3 VALUES('Donald','Atlanta','1999-04-01','2016-03-31'),('Mick','New
SELECT * FROM t3;
--replace_result $PORT PORT
--eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME=boys CONNECTION='jdbc:mysql://localhost:$PORT/connect?user=root' OPTION_LIST='scrollable=1'
--eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME=boys CONNECTION='jdbc:mysql://localhost:$PORT/connect?user=root&useSSL=false' OPTION_LIST='scrollable=1'
SELECT * FROM t1;
UPDATE t1 SET city = 'Phoenix' WHERE name = 'Henry';
INSERT INTO t1 SELECT * FROM t3;
@@ -145,4 +146,5 @@ DROP TABLE connect.tx1;
DROP DATABASE connect;
--remove_file $MYSQLD_DATADIR/test/girls.txt
SET GLOBAL time_zone=SYSTEM;
SET time_zone=SYSTEM;
-- source jdbconn_cleanup.inc

View File

@@ -9,7 +9,8 @@ connection master;
-- source jdbconn.inc
connection slave;
SET GLOBAL time_zone='+1:00';
SET GLOBAL time_zone='+0:00';
SET time_zone='+0:00';
CREATE TABLE t1 (a int, b char(10));
INSERT INTO t1 VALUES (NULL,NULL),(0,'test00'),(1,'test01'),(2,'test02'),(3,'test03');
@@ -19,33 +20,34 @@ SELECT * FROM t1;
--echo # Testing errors
--echo #
connection master;
SET GLOBAL time_zone='+1:00';
SET GLOBAL time_zone='+0:00';
SET time_zone='+0:00';
# Bad user name
# Suppress "mysql_real_connect failed:" (printed in _DEBUG build)
--replace_result $SLAVE_MYPORT SLAVE_PORT "mysql_real_connect failed: " ""
--error ER_UNKNOWN_ERROR
eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=unknown';
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=unknown&useSSL=false';
# Bad database name
--replace_result $SLAVE_MYPORT SLAVE_PORT "mysql_real_connect failed: " ""
--error ER_UNKNOWN_ERROR
eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/unknown?user=root';
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/unknown?user=root&useSSL=false';
# Bad table name
--replace_result $SLAVE_MYPORT SLAVE_PORT
--error ER_UNKNOWN_ERROR
eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME='unknown'
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root';
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root&useSSL=false';
--error ER_NO_SUCH_TABLE
SHOW CREATE TABLE t1;
# Bad column name
--replace_result $SLAVE_MYPORT SLAVE_PORT
eval CREATE TABLE t1 (x int, y char(10)) ENGINE=CONNECT TABLE_TYPE=JDBC
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root';
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root&useSSL=false';
--replace_result $SLAVE_MYPORT SLAVE_PORT
SHOW CREATE TABLE t1;
--error ER_GET_ERRMSG
@@ -55,7 +57,7 @@ DROP TABLE t1;
# The remote table disappeared
--replace_result $SLAVE_MYPORT SLAVE_PORT
eval CREATE TABLE t1 (a int, b char(10)) ENGINE=CONNECT TABLE_TYPE=JDBC
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root';
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root&useSSL=false';
connection slave;
ALTER TABLE t1 RENAME t1backup;
@@ -77,7 +79,7 @@ DROP TABLE t1;
# Automatic table structure
--replace_result $SLAVE_MYPORT SLAVE_PORT
eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root';
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root&useSSL=false';
--replace_result $SLAVE_MYPORT SLAVE_PORT
SHOW CREATE TABLE t1;
SELECT * FROM t1;
@@ -86,7 +88,7 @@ DROP TABLE t1;
# Explicit table structure
--replace_result $SLAVE_MYPORT SLAVE_PORT
eval CREATE TABLE t1 (a int, b char(10)) ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME='t1'
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root';
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root&useSSL=false';
--replace_result $SLAVE_MYPORT SLAVE_PORT
SHOW CREATE TABLE t1;
SELECT * FROM t1;
@@ -95,7 +97,7 @@ DROP TABLE t1;
# Explicit table structure: remote NULL, local NOT NULL
--replace_result $SLAVE_MYPORT SLAVE_PORT
eval CREATE TABLE t1 (a INT NOT NULL, b CHAR(10) NOT NULL) ENGINE=CONNECT TABLE_TYPE=JDBC
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root';
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root&useSSL=false';
--replace_result $SLAVE_MYPORT SLAVE_PORT
SHOW CREATE TABLE t1;
SELECT * FROM t1;
@@ -104,7 +106,7 @@ DROP TABLE t1;
# Explicit table structure with wrong column types
--replace_result $SLAVE_MYPORT SLAVE_PORT
eval CREATE TABLE t1 (a char(10), b int) ENGINE=CONNECT TABLE_TYPE=JDBC
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root';
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root&useSSL=false';
--replace_result $SLAVE_MYPORT SLAVE_PORT
SHOW CREATE TABLE t1;
SELECT * FROM t1;
@@ -125,7 +127,7 @@ INSERT INTO t1 VALUES(100,3333,41235,1234567890,235000000000,3.14159265,3.141592
connection master;
--replace_result $SLAVE_MYPORT SLAVE_PORT
eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root';
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root&useSSL=false';
--replace_result $SLAVE_MYPORT SLAVE_PORT
SHOW CREATE TABLE t1;
SELECT * FROM t1;
@@ -146,7 +148,7 @@ SELECT * FROM t1;
connection master;
--replace_result $SLAVE_MYPORT SLAVE_PORT
eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root';
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root&useSSL=false';
--replace_result $SLAVE_MYPORT SLAVE_PORT
SHOW CREATE TABLE t1;
SELECT * FROM t1;
@@ -167,7 +169,7 @@ SELECT * FROM t1;
connection master;
--replace_result $SLAVE_MYPORT SLAVE_PORT
eval CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root';
CONNECTION='jdbc:mysql://127.0.0.1:$SLAVE_MYPORT/test?user=root&useSSL=false';
--replace_result $SLAVE_MYPORT SLAVE_PORT
SHOW CREATE TABLE t1;
SELECT * FROM t1;
@@ -176,8 +178,10 @@ DROP TABLE t1;
connection slave;
DROP TABLE t1;
SET GLOBAL time_zone=SYSTEM;
SET time_zone=SYSTEM;
connection master;
SET GLOBAL time_zone=SYSTEM;
SET time_zone=SYSTEM;
-- source jdbconn_cleanup.inc

View File

@@ -8,20 +8,20 @@ CREATE TABLE t2 (
number int(5) not null flag=1,
message varchar(255) flag=2)
ENGINE=CONNECT TABLE_TYPE=JDBC CONNECTION='jdbc:oracle:thin:@localhost:1521:xe'
OPTION_LIST='User=system,Password=Choupy01,Execsrc=1';
OPTION_LIST='User=system,Password=Biscote01,Execsrc=1';
SELECT * FROM t2 WHERE command = 'drop table employee';
SELECT * FROM t2 WHERE command = 'create table employee (id int not null, name varchar(32), title char(16), salary number(8,2))';
SELECT * FROM t2 WHERE command = "insert into employee values(4567,'Johnson', 'Engineer', 12560.50)";
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC CATFUNC=tables
CONNECTION='jdbc:oracle:thin:@localhost:1521:xe'
OPTION_LIST='User=system,Password=Choupy01';
OPTION_LIST='User=system,Password=Biscote01';
SELECT * FROM t1 WHERE table_name='employee';
DROP TABLE t1;
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=JDBC TABNAME='EMPLOYEE' CATFUNC=columns
CONNECTION='jdbc:oracle:thin:@localhost:1521:xe'
OPTION_LIST='User=system,Password=Choupy01';
OPTION_LIST='User=system,Password=Biscote01';
SELECT * FROM t1;
DROP TABLE t1;
@@ -32,7 +32,7 @@ CREATE SERVER 'oracle' FOREIGN DATA WRAPPER 'oracle.jdbc.driver.OracleDriver' OP
HOST 'jdbc:oracle:thin:@localhost:1521:xe',
DATABASE 'SYSTEM',
USER 'system',
PASSWORD 'Choupy01',
PASSWORD 'Biscote01',
PORT 0,
SOCKET '',
OWNER 'SYSTEM');

View File

@@ -78,42 +78,42 @@ SET NAMES utf8;
--echo # All tables in all schemas (filtered with WHERE)
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
CATFUNC=Tables;
SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name;
DROP TABLE t1;
--echo # All tables in all schemas (filtered with WHERE)
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
CATFUNC=Tables TABNAME='%.%';
SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name;
DROP TABLE t1;
--echo # All tables "T1" in all schemas (filtered with WHERE)
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
CATFUNC=Tables TABNAME='%.T1';
SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name;
DROP TABLE t1;
--echo # All tables "T1" in all schemas (filtered with WHERE)
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
CATFUNC=Tables TABNAME='T1';
SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name;
DROP TABLE t1;
--echo # Table "T1" in the schema "MTR"
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
CATFUNC=Tables TABNAME='MTR.T1';
SELECT * FROM t1 ORDER BY Table_Schema, Table_Name;
DROP TABLE t1;
--echo # All tables in the schema "MTR"
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
CATFUNC=Tables TABNAME='MTR.%';
SELECT * FROM t1 ORDER BY Table_Schema, Table_Name;
DROP TABLE t1;
@@ -127,7 +127,7 @@ DROP TABLE t1;
--echo # All columns in all schemas (limited with WHERE)
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
CATFUNC=Columns;
# Disable warnings to avoid "Result limited to 20000 lines"
--disable_warnings
@@ -137,7 +137,7 @@ DROP TABLE t1;
--echo # All columns in all schemas (limited with WHERE)
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
CATFUNC=Columns TABNAME='%.%';
# Disable warnings to avoid "Result limited to 20000 lines"
--disable_warnings
@@ -146,20 +146,20 @@ SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name;
DROP TABLE t1;
--echo # All tables "T1" in all schemas (limited with WHERE)
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr' CATFUNC=Columns TABNAME='%.T1';
CREATE TABLE t1 ENGINE=CONNECT TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew' CATFUNC=Columns TABNAME='%.T1';
SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name;
DROP TABLE t1;
--echo # Table "T1" in the schema "MTR"
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
CATFUNC=Columns TABNAME='MTR.T1';
SELECT * FROM t1 ORDER BY Table_Schema, Table_Name;
DROP TABLE t1;
--echo # All tables "T1" in all schemas (filtered with WHERE)
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
CATFUNC=Columns TABNAME='%.T1';
SELECT * FROM t1 WHERE Table_Schema='MTR' ORDER BY Table_Schema, Table_Name;
DROP TABLE t1;
@@ -172,7 +172,7 @@ DROP TABLE t1;
--echo # Table "T1" in the default schema ("MTR")
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
TABNAME='T1';
SHOW CREATE TABLE t1;
SELECT * FROM t1 ORDER BY A;
@@ -189,7 +189,7 @@ DROP TABLE t1;
--echo # Table "T1" in the schema "MTR"
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
TABNAME='MTR.T1';
SHOW CREATE TABLE t1;
SELECT * FROM t1;
@@ -197,7 +197,7 @@ DROP TABLE t1;
--echo # View "V1" in the schema "MTR"
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
TABNAME='MTR.V1';
SHOW CREATE TABLE t1;
SELECT * FROM t1;
@@ -214,7 +214,7 @@ DROP TABLE t1;
--echo # Table "T2" in the schema "MTR"
CREATE TABLE t1 ENGINE=CONNECT
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=newmtr'
TABLE_TYPE=ODBC CONNECTION='DSN=ConnectEngineOracle;UID=mtr;PWD=mtrnew'
TABNAME='MTR.T2';
SHOW CREATE TABLE t1;
SELECT * FROM t1;

View File

@@ -13,11 +13,11 @@
/************************************************************************/
#include "my_global.h"
#include <mysql.h>
#if defined(__WIN__)
#if defined(_WIN32)
//#include <windows.h>
#else // !__WIN__
#else // !_WIN32
#include "osutil.h"
#endif // !__WIN__
#endif // !_WIN32
#include "global.h"
#include "plgdbsem.h"

View File

@@ -11,7 +11,7 @@
/***********************************************************************/
#include <my_global.h>
#include <m_string.h>
#if defined(__WIN__)
#if defined(_WIN32)
//nclude <io.h>
//nclude <fcntl.h>
#include <direct.h> // for getcwd
@@ -45,13 +45,13 @@
#include "osutil.h"
#if defined(__WIN__)
#if defined(_WIN32)
/***********************************************************************/
/* For dynamic load of ODBC32.DLL */
/***********************************************************************/
#pragma comment(lib, "odbc32.lib")
extern "C" HINSTANCE s_hModule; // Saved module handle
#endif // __WIN__
#endif // _WIN32
TYPCONV GetTypeConv();
int GetConvSize();
@@ -1280,15 +1280,15 @@ bool ODBConn::DriverConnect(DWORD Options)
SWORD nResult;
PUCHAR ConnOut = (PUCHAR)PlugSubAlloc(m_G, NULL, MAX_CONNECT_LEN);
UWORD wConnectOption = SQL_DRIVER_COMPLETE;
#if defined(__WIN__)
#if defined(_WIN32)
HWND hWndTop = GetForegroundWindow();
HWND hWnd = GetParent(hWndTop);
if (hWnd == NULL)
hWnd = GetDesktopWindow();
#else // !__WIN__
#else // !_WIN32
HWND hWnd = (HWND)1;
#endif // !__WIN__
#endif // !_WIN32
PGLOBAL& g = m_G;
PDBUSER dup = PlgGetUser(g);
@@ -1301,10 +1301,10 @@ bool ODBConn::DriverConnect(DWORD Options)
SQL_NTS, ConnOut, MAX_CONNECT_LEN,
&nResult, wConnectOption);
#if defined(__WIN__)
#if defined(_WIN32)
if (hWndTop)
EnableWindow(hWndTop, true);
#endif // __WIN__
#endif // _WIN32
// If user hit 'Cancel'
if (rc == SQL_NO_DATA_FOUND) {

View File

@@ -29,9 +29,9 @@
//efine MAX_CURSOR_NAME 18 // Max size of a cursor name
//efine DEFAULT_FIELD_TYPE SQL_TYPE_NULL // pick "C" data type to match SQL data type
#if !defined(__WIN__)
#if !defined(_WIN32)
typedef unsigned char *PUCHAR;
#endif // !__WIN__
#endif // !_WIN32
// Field Flags, used to indicate status of fields
//efine SQL_FIELD_FLAG_DIRTY 0x1

View File

@@ -16,19 +16,19 @@ typedef off_t off64_t;
#endif
#endif
#if defined(__WIN__)
#if defined(_WIN32)
typedef __int64 BIGINT;
typedef _Null_terminated_ const char *PCSZ;
#else // !__WIN__
#else // !_WIN32
typedef longlong BIGINT;
#define FILE_BEGIN SEEK_SET
#define FILE_CURRENT SEEK_CUR
#define FILE_END SEEK_END
typedef const char *PCSZ;
#endif // !__WIN__
#endif // !_WIN32
#if !defined(__WIN__)
#if !defined(_WIN32)
typedef const void *LPCVOID;
typedef const char *LPCTSTR;
typedef const char *LPCSTR;
@@ -65,6 +65,6 @@ typedef int HANDLE;
#define _MAX_EXT FN_EXTLEN
#define INVALID_HANDLE_VALUE (-1)
#define __stdcall
#endif /* !__WIN__ */
#endif /* !_WIN32 */
#endif /* _OS_H_INCLUDED */

View File

@@ -5,7 +5,7 @@
#include <stdio.h>
#include "osutil.h"
#ifdef __WIN__
#ifdef _WIN32
my_bool CloseFileHandle(HANDLE h)
{
return !CloseHandle(h);

View File

@@ -581,11 +581,11 @@ typedef struct _colres {
char Var; /* Type added information */
} COLRES;
#if defined(__WIN__) && !defined(NOEX)
#if defined(_WIN32) && !defined(NOEX)
#define DllExport __declspec( dllexport )
#else // !__WIN__
#else // !_WIN32
#define DllExport
#endif // !__WIN__
#endif // !_WIN32
/***********************************************************************/
/* Utility routines. */

View File

@@ -39,12 +39,12 @@
/***********************************************************************/
#include "my_global.h"
#include "my_pthread.h"
#if defined(__WIN__)
#if defined(_WIN32)
#include <io.h>
#include <fcntl.h>
#include <errno.h>
#define BIGMEM 1048576 // 1 Megabyte
#else // !__WIN__
#else // !_WIN32
#include <unistd.h>
#include <fcntl.h>
//#if defined(THREAD)
@@ -52,7 +52,7 @@
//#endif // THREAD
#include <stdarg.h>
#define BIGMEM 2147483647 // Max int value
#endif // !__WIN__
#endif // !_WIN32
#include <locale.h>
/***********************************************************************/
@@ -89,11 +89,11 @@ extern "C" {
extern char version[];
} // extern "C"
//#if defined(__WIN__)
//#if defined(_WIN32)
//extern CRITICAL_SECTION parsec; // Used calling the Flex parser
//#else // !__WIN__
//#else // !_WIN32
extern pthread_mutex_t parmut;
//#endif // !__WIN__
//#endif // !_WIN32
// The debug trace used by the main thread
FILE *pfile = NULL;
@@ -386,11 +386,11 @@ char *SetPath(PGLOBAL g, const char *path)
} // endif path
if (*path != '.') {
#if defined(__WIN__)
#if defined(_WIN32)
const char *s = "\\";
#else // !__WIN__
#else // !_WIN32
const char *s = "/";
#endif // !__WIN__
#endif // !_WIN32
strcat(strcat(strcat(strcpy(buf, "."), s), path), s);
} else
strcpy(buf, path);
@@ -409,7 +409,7 @@ char *ExtractFromPath(PGLOBAL g, char *pBuff, char *FileName, OPVAL op)
char *drive = NULL, *direc = NULL, *fname = NULL, *ftype = NULL;
switch (op) { // Determine which part to extract
#if defined(__WIN__)
#if defined(_WIN32)
case OP_FDISK: drive = pBuff; break;
#endif // !UNIX
case OP_FPATH: direc = pBuff; break;
@@ -1249,7 +1249,7 @@ void *PlgDBalloc(PGLOBAL g, void *area, MBLOCK& mp)
// For allocations greater than one fourth of remaining storage
// in the area, do allocate from virtual storage.
const char*v = "malloc";
#if defined(__WIN__)
#if defined(_WIN32)
if (mp.Size >= BIGMEM) {
v = "VirtualAlloc";
mp.Memp = VirtualAlloc(NULL, mp.Size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
@@ -1352,7 +1352,7 @@ void PlgDBfree(MBLOCK& mp)
{
if (!mp.Sub && mp.Memp) {
const char*v = "free";
#if defined(__WIN__)
#if defined(_WIN32)
if (mp.Size >= BIGMEM) {
v = "VirtualFree";
VirtualFree(mp.Memp, 0, MEM_RELEASE);
@@ -1554,11 +1554,11 @@ int FileComp(PGLOBAL g, char *file1, char *file2)
bp[0] = buff1; bp[1] = buff2;
for (i = 0; i < 2; i++) {
#if defined(__WIN__)
#if defined(_WIN32)
h[i]= global_open(g, MSGID_NONE, fn[i], _O_RDONLY | _O_BINARY);
#else // !__WIN__
#else // !_WIN32
h[i]= global_open(g, MSGOD_NONE, fn[i], O_RDONLY);
#endif // !__WIN__
#endif // !_WIN32
if (h[i] == -1) {
// if (errno != ENOENT) {

View File

@@ -44,7 +44,7 @@
/* */
/***********************************************************************/
#include "my_global.h"
#if defined(__WIN__)
#if defined(_WIN32)
//#include <windows.h>
#else
#if defined(UNIX) || defined(UNIV_LINUX)
@@ -81,9 +81,9 @@
#include "rcmsg.h"
#endif // NEWMSG
#if defined(__WIN__)
#if defined(_WIN32)
extern HINSTANCE s_hModule; /* Saved module handle */
#endif // __WIN__
#endif // _WIN32
#if defined(XMSG)
extern char *msg_path;
@@ -205,7 +205,7 @@ PGLOBAL PlugExit(PGLOBAL g)
/***********************************************************************/
LPSTR PlugRemoveType(LPSTR pBuff, LPCSTR FileName)
{
#if defined(__WIN__)
#if defined(_WIN32)
char drive[_MAX_DRIVE];
#else
char *drive = NULL;
@@ -232,7 +232,7 @@ LPSTR PlugRemoveType(LPSTR pBuff, LPCSTR FileName)
BOOL PlugIsAbsolutePath(LPCSTR path)
{
#if defined(__WIN__)
#if defined(_WIN32)
return ((path[0] >= 'a' && path[0] <= 'z') ||
(path[0] >= 'A' && path[0] <= 'Z')) && path[1] == ':';
#else
@@ -250,7 +250,7 @@ LPCSTR PlugSetPath(LPSTR pBuff, LPCSTR prefix, LPCSTR FileName, LPCSTR defpath)
char direc[_MAX_DIR], defdir[_MAX_DIR], tmpdir[_MAX_DIR];
char fname[_MAX_FNAME];
char ftype[_MAX_EXT];
#if defined(__WIN__)
#if defined(_WIN32)
char drive[_MAX_DRIVE], defdrv[_MAX_DRIVE];
#else
char *drive = NULL, *defdrv = NULL;
@@ -270,7 +270,7 @@ LPCSTR PlugSetPath(LPSTR pBuff, LPCSTR prefix, LPCSTR FileName, LPCSTR defpath)
return pBuff;
} // endif
#if !defined(__WIN__)
#if !defined(_WIN32)
if (*FileName == '~') {
if (_fullpath(pBuff, FileName, _MAX_PATH)) {
if (trace(2))
@@ -281,7 +281,7 @@ LPCSTR PlugSetPath(LPSTR pBuff, LPCSTR prefix, LPCSTR FileName, LPCSTR defpath)
return FileName; // Error, return unchanged name
} // endif FileName
#endif // !__WIN__
#endif // !_WIN32
if (prefix && strcmp(prefix, ".") && !PlugIsAbsolutePath(defpath))
{
@@ -310,7 +310,7 @@ LPCSTR PlugSetPath(LPSTR pBuff, LPCSTR prefix, LPCSTR FileName, LPCSTR defpath)
if (trace(2)) {
htrc("after _splitpath: FileName=%s\n", FileName);
#if defined(__WIN__)
#if defined(_WIN32)
htrc("drive=%s dir=%s fname=%s ext=%s\n", drive, direc, fname, ftype);
htrc("defdrv=%s defdir=%s\n", defdrv, defdir);
#else
@@ -442,7 +442,7 @@ char *PlugGetMessage(PGLOBAL g, int mid)
} // end of PlugGetMessage
#endif // NEWMSG
#if defined(__WIN__)
#if defined(_WIN32)
/***********************************************************************/
/* Return the line length of the console screen buffer. */
/***********************************************************************/
@@ -454,7 +454,7 @@ short GetLineLength(PGLOBAL g)
return (b) ? coninfo.dwSize.X : 0;
} // end of GetLineLength
#endif // __WIN__
#endif // _WIN32
/***********************************************************************/
/* Program for memory allocation of work and language areas. */
@@ -464,7 +464,7 @@ bool AllocSarea(PGLOBAL g, size_t size)
/*********************************************************************/
/* This is the allocation routine for the WIN32/UNIX/AIX version. */
/*********************************************************************/
#if defined(__WIN__)
#if defined(_WIN32)
if (size >= 1048576) // 1M
g->Sarea = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
else
@@ -500,7 +500,7 @@ bool AllocSarea(PGLOBAL g, size_t size)
void FreeSarea(PGLOBAL g)
{
if (g->Sarea) {
#if defined(__WIN__)
#if defined(_WIN32)
if (g->Sarea_Size >= 1048576) // 1M
VirtualFree(g->Sarea, 0, MEM_RELEASE);
else

View File

@@ -21,9 +21,9 @@
#include "msgid.h"
#endif // NEWMSG
#if !defined(__WIN__)
#if !defined(_WIN32)
#define stricmp strcasecmp
#endif // !__WIN__
#endif // !_WIN32
char *msglang(void);

View File

@@ -17,7 +17,7 @@
/* Include relevant MariaDB header file. */
/***********************************************************************/
#include "my_global.h"
#if defined(__WIN__)
#if defined(_WIN32)
#include <sqlext.h>
#else
//#include <dlfcn.h> // dlopen(), dlclose(), dlsym() ...
@@ -52,9 +52,9 @@
#include "ha_connect.h"
#include "mycat.h"
#if !defined(__WIN__)
#if !defined(_WIN32)
extern handlerton *connect_hton;
#endif // !__WIN__
#endif // !_WIN32
/***********************************************************************/
/* External function. */
@@ -71,11 +71,11 @@ 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__)
#if defined(_WIN32)
HANDLE hdll; /* Handle to the external DLL */
#else // !__WIN__
#else // !_WIN32
void* hdll; /* Handle for the loaded shared library */
#endif // !__WIN__
#endif // !_WIN32
XCOLDEF coldef = NULL;
PQRYRES qrp = NULL;
@@ -93,8 +93,7 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char* tab, char* db, bool info)
if (check_valid_path(module, strlen(module))) {
strcpy(g->Message, "Module cannot contain a path");
return NULL;
}
else
} else
PlugSetPath(soname, module, GetPluginDir());
// The exported name is always in uppercase
@@ -104,7 +103,7 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char* tab, char* db, bool info)
if (!c) break;
} // endfor i
#if defined(__WIN__)
#if defined(_WIN32)
// Load the Dll implementing the table
if (!(hdll = LoadLibrary(soname))) {
char buf[256];
@@ -124,7 +123,7 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char* tab, char* db, bool info)
FreeLibrary((HMODULE)hdll);
return NULL;
} // endif coldef
#else // !__WIN__
#else // !_WIN32
const char* error = NULL;
// Load the desired shared library
@@ -141,7 +140,7 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char* tab, char* db, bool info)
dlclose(hdll);
return NULL;
} // endif coldef
#endif // !__WIN__
#endif // !_WIN32
// Just in case the external Get function does not set error messages
sprintf(g->Message, "Error getting column info from %s", subtype);
@@ -149,11 +148,11 @@ PQRYRES OEMColumns(PGLOBAL g, PTOS topt, char* tab, char* db, bool info)
// Get the table column definition
qrp = coldef(g, topt, tab, db, info);
#if defined(__WIN__)
#if defined(_WIN32)
FreeLibrary((HMODULE)hdll);
#else // !__WIN__
#else // !_WIN32
dlclose(hdll);
#endif // !__WIN__
#endif // !_WIN32
return qrp;
} // end of OEMColumns
@@ -408,13 +407,13 @@ int TABDEF::GetColCatInfo(PGLOBAL g)
// Take care of the column definitions
i= poff= nof= nlg= 0;
#if defined(__WIN__)
#if defined(_WIN32)
// Offsets of HTML and DIR tables start from 0, DBF at 1
loff= (trf == RECFM_DBF) ? 1 : (trf == RECFM_XML || trf == RECFM_DIR) ? -1 : 0;
#else // !__WIN__
#else // !_WIN32
// Offsets of HTML tables start from 0, DIR and DBF at 1
loff = (trf == RECFM_DBF || trf == RECFM_DIR) ? 1 : (trf == RECFM_XML) ? -1 : 0;
#endif // !__WIN__
#endif // !_WIN32
while (true) {
// Default Offset depends on table format
@@ -625,7 +624,7 @@ PTABDEF OEMDEF::GetXdef(PGLOBAL g)
strncat(strcpy(soname, GetPluginDir()), Module,
sizeof(soname) - strlen(soname) - 1);
#if defined(__WIN__)
#if defined(_WIN32)
// Is the DLL already loaded?
if (!Hdll && !(Hdll = GetModuleHandle(soname)))
// No, load the Dll implementing the function
@@ -661,7 +660,7 @@ PTABDEF OEMDEF::GetXdef(PGLOBAL g)
FreeLibrary((HMODULE)Hdll);
return NULL;
} // endif getdef
#else // !__WIN__
#else // !_WIN32
const char *error = NULL;
#if 0 // Don't know what all this stuff does
@@ -703,7 +702,7 @@ PTABDEF OEMDEF::GetXdef(PGLOBAL g)
dlclose(Hdll);
return NULL;
} // endif getdef
#endif // !__WIN__
#endif // !_WIN32
// Just in case the external Get function does not set error messages
sprintf(g->Message, MSG(DEF_ALLOC_ERROR), Subtype);

View File

@@ -146,11 +146,11 @@ class DllExport OEMDEF : public TABDEF { /* OEM table */
PTABDEF GetXdef(PGLOBAL g);
// Members
#if defined(__WIN__)
#if defined(_WIN32)
HANDLE Hdll; /* Handle to the external DLL */
#else // !__WIN__
#else // !_WIN32
void *Hdll; /* Handle for the loaded shared library */
#endif // !__WIN__
#endif // !_WIN32
PTABDEF Pxdef; /* Pointer to the external TABDEF class */
char *Module; /* Path/Name of the DLL implenting it */
char *Subtype; /* The name of the OEM table sub type */

Some files were not shown because too many files have changed in this diff Show More