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:
Submodule libmariadb updated: 490100ccac...0cc16f18c1
10
pcre/AUTHORS
10
pcre/AUTHORS
@@ -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.
|
||||
|
||||
|
||||
|
@@ -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}")
|
||||
|
@@ -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
|
||||
|
10
pcre/LICENCE
10
pcre/LICENCE
@@ -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.
|
||||
|
||||
|
||||
|
10
pcre/NEWS
10
pcre/NEWS
@@ -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
|
||||
|
@@ -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
|
||||
==========================
|
||||
|
11
pcre/README
11
pcre/README
@@ -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
|
||||
|
@@ -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])
|
||||
|
||||
|
@@ -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
|
||||
==========================
|
||||
|
@@ -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
|
||||
|
@@ -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 © 1997-2015 University of Cambridge.
|
||||
Copyright © 1997-2021 University of Cambridge.
|
||||
<br>
|
||||
<p>
|
||||
Return to the <a href="index.html">PCRE index page</a>.
|
||||
|
@@ -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.
|
||||
|
@@ -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".
|
||||
|
@@ -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>
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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.
|
||||
|
@@ -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".
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
|
@@ -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
|
||||
|
3
pcre/testdata/testinput1
vendored
3
pcre/testdata/testinput1
vendored
@@ -5757,4 +5757,7 @@ AbcdCBefgBhiBqz
|
||||
/(?&word)* \. (?<word> \w+ )/xi
|
||||
pokus.hokus
|
||||
|
||||
/(?:A(*:X))*+/K
|
||||
A
|
||||
|
||||
/-- End of testinput1 --/
|
||||
|
5
pcre/testdata/testoutput1
vendored
5
pcre/testdata/testoutput1
vendored
@@ -9470,4 +9470,9 @@ No match
|
||||
0: pokus.hokus
|
||||
1: hokus
|
||||
|
||||
/(?:A(*:X))*+/K
|
||||
A
|
||||
0: A
|
||||
MK: X
|
||||
|
||||
/-- End of testinput1 --/
|
||||
|
@@ -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;
|
||||
|
130
storage/connect/Client2.java
Normal file
130
storage/connect/Client2.java
Normal 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
|
154
storage/connect/Client3.java
Normal file
154
storage/connect/Client3.java
Normal 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
|
@@ -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;
|
||||
|
@@ -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
|
||||
|
131
storage/connect/TestInsert2.java
Normal file
131
storage/connect/TestInsert2.java
Normal 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
|
||||
|
||||
}
|
131
storage/connect/TestInsert3.java
Normal file
131
storage/connect/TestInsert3.java
Normal 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
|
||||
|
||||
}
|
@@ -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 */
|
||||
|
@@ -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: */
|
||||
|
@@ -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. */
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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");
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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:
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
|
@@ -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;}
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
|
@@ -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. */
|
||||
|
@@ -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);
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
||||
|
||||
|
||||
/***********************************************************************/
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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)
|
||||
|
@@ -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();
|
||||
|
@@ -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) {
|
||||
|
@@ -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);
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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:
|
||||
|
@@ -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");
|
||||
|
@@ -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"
|
||||
|
@@ -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;
|
||||
|
@@ -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 */
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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 */
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
|
@@ -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, "*")) {
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
#
|
||||
|
@@ -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;
|
||||
|
@@ -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;
|
||||
|
@@ -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');
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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;
|
||||
#
|
||||
|
@@ -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'
|
||||
|
@@ -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'
|
||||
|
@@ -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'
|
||||
|
@@ -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
|
||||
|
Binary file not shown.
Binary file not shown.
@@ -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
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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');
|
||||
|
@@ -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;
|
||||
|
@@ -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"
|
||||
|
@@ -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) {
|
||||
|
@@ -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
|
||||
|
@@ -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 */
|
||||
|
@@ -5,7 +5,7 @@
|
||||
#include <stdio.h>
|
||||
#include "osutil.h"
|
||||
|
||||
#ifdef __WIN__
|
||||
#ifdef _WIN32
|
||||
my_bool CloseFileHandle(HANDLE h)
|
||||
{
|
||||
return !CloseHandle(h);
|
||||
|
@@ -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. */
|
||||
|
@@ -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) {
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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
Reference in New Issue
Block a user