Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
094b01d4
Commit
094b01d4
authored
Jun 09, 2014
by
Sergei Golubchik
Browse files
Options
Browse Files
Download
Plain Diff
10.0-connect
parents
e6a2d95a
c1973c80
Changes
18
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
18 changed files
with
539 additions
and
510 deletions
+539
-510
storage/connect/colblk.h
storage/connect/colblk.h
+1
-0
storage/connect/filamdbf.cpp
storage/connect/filamdbf.cpp
+30
-28
storage/connect/ha_connect.cc
storage/connect/ha_connect.cc
+4
-8
storage/connect/mysql-test/connect/r/csv.result
storage/connect/mysql-test/connect/r/csv.result
+2
-2
storage/connect/mysql-test/connect/r/dbf.result
storage/connect/mysql-test/connect/r/dbf.result
+2
-2
storage/connect/mysql-test/connect/r/fix.result
storage/connect/mysql-test/connect/r/fix.result
+2
-2
storage/connect/mysql-test/connect/r/ini.result
storage/connect/mysql-test/connect/r/ini.result
+2
-2
storage/connect/mysql-test/connect/r/vec.result
storage/connect/mysql-test/connect/r/vec.result
+2
-2
storage/connect/mysql-test/connect/t/csv.test
storage/connect/mysql-test/connect/t/csv.test
+185
-185
storage/connect/mysql-test/connect/t/dbf.test
storage/connect/mysql-test/connect/t/dbf.test
+2
-2
storage/connect/mysql-test/connect/t/fix.test
storage/connect/mysql-test/connect/t/fix.test
+2
-2
storage/connect/mysql-test/connect/t/ini.test
storage/connect/mysql-test/connect/t/ini.test
+156
-156
storage/connect/mysql-test/connect/t/vec.test
storage/connect/mysql-test/connect/t/vec.test
+80
-80
storage/connect/reldef.h
storage/connect/reldef.h
+2
-0
storage/connect/tabdos.cpp
storage/connect/tabdos.cpp
+27
-10
storage/connect/tabdos.h
storage/connect/tabdos.h
+2
-1
storage/connect/tabfmt.cpp
storage/connect/tabfmt.cpp
+37
-26
storage/connect/tabmysql.cpp
storage/connect/tabmysql.cpp
+1
-2
No files found.
storage/connect/colblk.h
View file @
094b01d4
...
...
@@ -55,6 +55,7 @@ class DllExport COLBLK : public XOBJECT {
PSZ
GetFmt
(
void
)
{
return
(
Cdp
)
?
Cdp
->
Fmt
:
NULL
;}
bool
IsUnsigned
(
void
)
{
return
Unsigned
;}
bool
IsNullable
(
void
)
{
return
Nullable
;}
bool
IsVirtual
(
void
)
{
return
Cdp
->
IsVirtual
();}
void
SetNullable
(
bool
b
)
{
Nullable
=
b
;}
// Methods
...
...
storage/connect/filamdbf.cpp
View file @
094b01d4
...
...
@@ -546,10 +546,11 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g)
PDOSDEF
tdp
=
(
PDOSDEF
)
Tdbp
->
GetDef
();
// Count the number of columns
for
(
cdp
=
tdp
->
GetCols
();
cdp
;
cdp
=
cdp
->
GetNext
())
{
reclen
+=
cdp
->
GetLong
();
n
++
;
}
// endfor cdp
for
(
cdp
=
tdp
->
GetCols
();
cdp
;
cdp
=
cdp
->
GetNext
())
if
(
!
(
cdp
->
Flags
&
U_SPECIAL
))
{
reclen
+=
cdp
->
GetLong
();
n
++
;
}
// endif Flags
if
(
Lrecl
!=
reclen
)
{
sprintf
(
g
->
Message
,
MSG
(
BAD_LRECL
),
Lrecl
,
reclen
);
...
...
@@ -570,30 +571,31 @@ bool DBFFAM::AllocateBuffer(PGLOBAL g)
descp
=
(
DESCRIPTOR
*
)
header
;
// Currently only standard Xbase types are supported
for
(
cdp
=
tdp
->
GetCols
();
cdp
;
cdp
=
cdp
->
GetNext
())
{
descp
++
;
switch
((
c
=
*
GetFormatType
(
cdp
->
GetType
())))
{
case
'S'
:
// Short integer
case
'L'
:
// Large (big) integer
case
'T'
:
// Tiny integer
c
=
'N'
;
// Numeric
case
'N'
:
// Numeric (integer)
case
'F'
:
// Float (double)
descp
->
Decimals
=
(
uchar
)
cdp
->
F
.
Prec
;
case
'C'
:
// Char
case
'D'
:
// Date
break
;
default:
// Should never happen
sprintf
(
g
->
Message
,
"Unsupported DBF type %c for column %s"
,
c
,
cdp
->
GetName
());
return
true
;
}
// endswitch c
strncpy
(
descp
->
Name
,
cdp
->
GetName
(),
11
);
descp
->
Type
=
c
;
descp
->
Length
=
(
uchar
)
cdp
->
GetLong
();
}
// endfor cdp
for
(
cdp
=
tdp
->
GetCols
();
cdp
;
cdp
=
cdp
->
GetNext
())
if
(
!
(
cdp
->
Flags
&
U_SPECIAL
))
{
descp
++
;
switch
((
c
=
*
GetFormatType
(
cdp
->
GetType
())))
{
case
'S'
:
// Short integer
case
'L'
:
// Large (big) integer
case
'T'
:
// Tiny integer
c
=
'N'
;
// Numeric
case
'N'
:
// Numeric (integer)
case
'F'
:
// Float (double)
descp
->
Decimals
=
(
uchar
)
cdp
->
F
.
Prec
;
case
'C'
:
// Char
case
'D'
:
// Date
break
;
default:
// Should never happen
sprintf
(
g
->
Message
,
"Unsupported DBF type %c for column %s"
,
c
,
cdp
->
GetName
());
return
true
;
}
// endswitch c
strncpy
(
descp
->
Name
,
cdp
->
GetName
(),
11
);
descp
->
Type
=
c
;
descp
->
Length
=
(
uchar
)
cdp
->
GetLong
();
}
// endif Flags
*
(
char
*
)(
++
descp
)
=
EOH
;
...
...
storage/connect/ha_connect.cc
View file @
094b01d4
...
...
@@ -1058,6 +1058,7 @@ void *ha_connect::GetColumnOption(PGLOBAL g, void *field, PCOLINFO pcf)
break
;
case
TYPE_DECIM
:
pcf
->
Precision
=
((
Field_new_decimal
*
)
fp
)
->
precision
;
pcf
->
Length
=
pcf
->
Precision
;
pcf
->
Scale
=
fp
->
decimals
();
break
;
case
TYPE_DATE
:
...
...
@@ -2708,7 +2709,6 @@ int ha_connect::index_next_same(uchar *buf, const uchar *key, uint keylen)
*/
int
ha_connect
::
rnd_init
(
bool
scan
)
{
int
rc
;
PGLOBAL
g
=
((
table
&&
table
->
in_use
)
?
GetPlug
(
table
->
in_use
,
xp
)
:
(
xp
)
?
xp
->
g
:
NULL
);
DBUG_ENTER
(
"ha_connect::rnd_init"
);
...
...
@@ -2742,8 +2742,8 @@ int ha_connect::rnd_init(bool scan)
if
(
xmod
==
MODE_UPDATE
)
bitmap_union
(
table
->
read_set
,
table
->
write_set
);
if
(
(
rc
=
OpenTable
(
g
,
xmod
==
MODE_DELETE
)
))
DBUG_RETURN
(
rc
);
if
(
OpenTable
(
g
,
xmod
==
MODE_DELETE
))
DBUG_RETURN
(
HA_ERR_INITIALIZATION
);
xp
->
nrd
=
xp
->
fnd
=
xp
->
nfd
=
0
;
xp
->
tb1
=
my_interval_timer
();
...
...
@@ -4239,7 +4239,6 @@ static int connect_assisted_discovery(handlerton *hton, THD* thd,
strncpy
(
dsn
,
create_info
->
connect_string
.
str
,
len
);
dsn
[
len
]
=
0
;
mydef
->
SetName
(
create_info
->
alias
);
mydef
->
SetCat
(
cat
);
if
(
!
mydef
->
ParseURL
(
g
,
dsn
,
false
))
{
if
(
mydef
->
GetHostname
())
...
...
@@ -4696,21 +4695,18 @@ int ha_connect::create(const char *name, TABLE *table_arg,
int
port
;
host
=
GetListOption
(
g
,
"host"
,
options
->
oplist
,
NULL
);
db
=
Get
ListOption
(
g
,
"database"
,
options
->
oplist
,
NULL
);
db
=
Get
StringOption
(
"database"
,
NULL
);
port
=
atoi
(
GetListOption
(
g
,
"port"
,
options
->
oplist
,
"0"
));
if
(
create_info
->
connect_string
.
str
)
{
char
*
dsn
;
int
len
=
create_info
->
connect_string
.
length
;
PMYDEF
mydef
=
new
(
g
)
MYSQLDEF
();
PDBUSER
dup
=
PlgGetUser
(
g
);
PCATLG
cat
=
(
dup
)
?
dup
->
Catalog
:
NULL
;
dsn
=
(
char
*
)
PlugSubAlloc
(
g
,
NULL
,
len
+
1
);
strncpy
(
dsn
,
create_info
->
connect_string
.
str
,
len
);
dsn
[
len
]
=
0
;
mydef
->
SetName
(
create_info
->
alias
);
mydef
->
SetCat
(
cat
);
if
(
!
mydef
->
ParseURL
(
g
,
dsn
,
false
))
{
if
(
mydef
->
GetHostname
())
...
...
storage/connect/mysql-test/connect/r/csv.result
View file @
094b01d4
...
...
@@ -52,9 +52,9 @@ children SMALLINT(2) NOT NULL
INSERT INTO t1 VALUES ('BILL','1973-06-30',5);
ERROR HY000: Table 't1' is read only
UPDATE t1 SET children=6 WHERE name='BILL';
ERROR HY000:
Table 't1' is read only
ERROR HY000:
Got error 174 'Cannot modify this read/only protected table' from CONNECT
DELETE FROM t1 WHERE name='BILL';
ERROR HY000:
Table 't1' is read only
ERROR HY000:
Got error 174 'Cannot modify this read/only protected table' from CONNECT
TRUNCATE TABLE t1;
ERROR HY000: Table 't1' is read only
SELECT * FROM t1;
...
...
storage/connect/mysql-test/connect/r/dbf.result
View file @
094b01d4
...
...
@@ -77,9 +77,9 @@ t1 CREATE TABLE `t1` (
INSERT INTO t1 VALUES (30);
ERROR HY000: Table 't1' is read only
UPDATE t1 SET a=30 WHERE a=10;
ERROR HY000:
Table 't1' is read only
ERROR HY000:
Got error 174 'Cannot modify this read/only protected table' from CONNECT
DELETE FROM t1 WHERE a=10;
ERROR HY000:
Table 't1' is read only
ERROR HY000:
Got error 174 'Cannot modify this read/only protected table' from CONNECT
TRUNCATE TABLE t1;
ERROR HY000: Table 't1' is read only
ALTER TABLE t1 READONLY=NO;
...
...
storage/connect/mysql-test/connect/r/fix.result
View file @
094b01d4
...
...
@@ -30,9 +30,9 @@ t1 CREATE TABLE `t1` (
INSERT INTO t1 VALUES (20);
ERROR HY000: Table 't1' is read only
UPDATE t1 SET id=20 WHERE id=10;
ERROR HY000:
Table 't1' is read only
ERROR HY000:
Got error 174 'Cannot modify this read/only protected table' from CONNECT
DELETE FROM t1 WHERE id=10;
ERROR HY000:
Table 't1' is read only
ERROR HY000:
Got error 174 'Cannot modify this read/only protected table' from CONNECT
TRUNCATE TABLE t1;
ERROR HY000: Table 't1' is read only
ALTER TABLE t1 READONLY=0;
...
...
storage/connect/mysql-test/connect/r/ini.result
View file @
094b01d4
...
...
@@ -194,9 +194,9 @@ t1 CREATE TABLE `t1` (
INSERT INTO t1 VALUES ('US',40);
ERROR HY000: Table 't1' is read only
UPDATE t1 SET c2=20 WHERE c2=10;
ERROR HY000:
Table 't1' is read only
ERROR HY000:
Got error 174 'Cannot modify this read/only protected table' from CONNECT
DELETE FROM t1 WHERE c2=10;
ERROR HY000:
Table 't1' is read only
ERROR HY000:
Got error 174 'Cannot modify this read/only protected table' from CONNECT
TRUNCATE TABLE t1;
ERROR HY000: Table 't1' is read only
ALTER TABLE t1 READONLY=0;
...
...
storage/connect/mysql-test/connect/r/vec.result
View file @
094b01d4
...
...
@@ -103,9 +103,9 @@ t1 CREATE TABLE `t1` (
INSERT INTO t1 VALUES (4,'test04');
ERROR HY000: Table 't1' is read only
UPDATE t1 SET b='test04' WHERE a=3;
ERROR HY000:
Table 't1' is read only
ERROR HY000:
Got error 174 'Cannot modify this read/only protected table' from CONNECT
DELETE FROM t1 WHERE a=3;
ERROR HY000:
Table 't1' is read only
ERROR HY000:
Got error 174 'Cannot modify this read/only protected table' from CONNECT
TRUNCATE TABLE t1;
ERROR HY000: Table 't1' is read only
ALTER TABLE t1 READONLY=no;
...
...
storage/connect/mysql-test/connect/t/csv.test
View file @
094b01d4
This diff is collapsed.
Click to expand it.
storage/connect/mysql-test/connect/t/dbf.test
View file @
094b01d4
...
...
@@ -68,9 +68,9 @@ ALTER TABLE t1 READONLY=Yes;
SHOW
CREATE
TABLE
t1
;
--
error
ER_OPEN_AS_READONLY
INSERT
INTO
t1
VALUES
(
30
);
--
error
ER_
OPEN_AS_READONLY
--
error
ER_
GET_ERRMSG
UPDATE
t1
SET
a
=
30
WHERE
a
=
10
;
--
error
ER_
OPEN_AS_READONLY
--
error
ER_
GET_ERRMSG
DELETE
FROM
t1
WHERE
a
=
10
;
--
error
ER_OPEN_AS_READONLY
TRUNCATE
TABLE
t1
;
...
...
storage/connect/mysql-test/connect/t/fix.test
View file @
094b01d4
...
...
@@ -30,9 +30,9 @@ ALTER TABLE t1 READONLY=1;
SHOW
CREATE
TABLE
t1
;
--
error
ER_OPEN_AS_READONLY
INSERT
INTO
t1
VALUES
(
20
);
--
error
ER_
OPEN_AS_READONLY
--
error
ER_
GET_ERRMSG
UPDATE
t1
SET
id
=
20
WHERE
id
=
10
;
--
error
ER_
OPEN_AS_READONLY
--
error
ER_
GET_ERRMSG
DELETE
FROM
t1
WHERE
id
=
10
;
--
error
ER_OPEN_AS_READONLY
TRUNCATE
TABLE
t1
;
...
...
storage/connect/mysql-test/connect/t/ini.test
View file @
094b01d4
let
$MYSQLD_DATADIR
=
`select @@datadir`
;
--
copy_file
$MTR_SUITE_DIR
/
std_data
/
contact
.
ini
$MYSQLD_DATADIR
/
test
/
contact
.
ini
--
echo
#
--
echo
# Testing errors
--
echo
#
CREATE
TABLE
t1
(
ID
INT
)
Engine
=
CONNECT
TABLE_TYPE
=
INI
FILE_NAME
=
'nonexistent.txt'
;
--
replace_regex
/
on
.*
test
.
nonexistent
.
txt
/
on
DATADIR
\
/
test
\
/
nonexistent
.
txt
/
# TODO: check why this is needed for Windows
--
replace_result
Open
(
rt
)
Open
(
rb
)
SELECT
*
FROM
t1
;
DROP
TABLE
t1
;
--
echo
#
--
echo
# Testing examples from the manual
--
echo
#
CREATE
TABLE
t1
(
contact
CHAR
(
16
)
flag
=
1
,
name
CHAR
(
20
),
forename
CHAR
(
32
),
hired
date
date_format
=
'DD/MM/YYYY'
,
address
CHAR
(
64
),
city
CHAR
(
20
),
zipcode
CHAR
(
8
),
tel
CHAR
(
16
)
)
ENGINE
=
CONNECT
TABLE_TYPE
=
INI
FILE_NAME
=
'contact.ini'
;
SELECT
contact
,
name
,
hired
,
city
,
tel
FROM
t1
;
UPDATE
t1
SET
forename
=
'Harry'
where
contact
=
'UK1'
;
SELECT
*
FROM
t1
WHERE
contact
=
'UK1'
;
INSERT
INTO
t1
(
contact
,
forename
)
VALUES
(
'UK1'
,
'Harrison'
);
SELECT
*
FROM
t1
WHERE
contact
=
'UK1'
;
INSERT
INTO
t1
(
contact
,
forename
)
VALUES
(
'UK2'
,
'John'
);
SELECT
*
FROM
t1
WHERE
contact
=
'UK2'
;
DROP
TABLE
t1
;
--
chmod
0777
$MYSQLD_DATADIR
/
test
/
contact
.
ini
--
replace_result
$MYSQLD_DATADIR
DATADIR
--
eval
SELECT
REPLACE
(
REPLACE
(
LOAD_FILE
(
'$MYSQLD_DATADIR/test/contact.ini'
),
'\r\n'
,
'\n'
),
'\n\n'
,
'\n'
);
CREATE
TABLE
t1
(
section
CHAR
(
16
)
flag
=
1
,
keyname
CHAR
(
16
)
flag
=
2
,
value
CHAR
(
32
)
)
ENGINE
=
CONNECT
TABLE_TYPE
=
INI
FILE_NAME
=
'contact.ini'
OPTION_LIST
=
'Layout=Row'
;
UPDATE
t1
SET
value
=
'Paul'
WHERE
section
=
'UK2'
AND
keyname
=
'forename'
;
SELECT
*
FROM
t1
;
DROP
TABLE
t1
;
--
chmod
0777
$MYSQLD_DATADIR
/
test
/
contact
.
ini
--
replace_result
$MYSQLD_DATADIR
DATADIR
--
eval
SELECT
REPLACE
(
REPLACE
(
LOAD_FILE
(
'$MYSQLD_DATADIR/test/contact.ini'
),
'\r\n'
,
'\n'
),
'\n\n'
,
'\n'
);
--
echo
#
--
echo
# Testing that the underlying file is created
--
echo
#
CREATE
TABLE
t1
(
contact
CHAR
(
12
)
NOT
NULL
flag
=
1
,
c2
CHAR
(
12
)
NOT
NULL
)
ENGINE
=
CONNECT
TABLE_TYPE
=
INI
FILE_NAME
=
'tmp.ini'
;
INSERT
INTO
t1
VALUES
(
10
,
10
),(
20
,
20
),(
300
,
300
),(
4000
,
4000
),
(
'a b'
,
'c d'
);
SELECT
*
FROM
t1
;
DROP
TABLE
t1
;
--
chmod
0777
$MYSQLD_DATADIR
/
test
/
tmp
.
ini
--
replace_result
$MYSQLD_DATADIR
DATADIR
--
eval
SELECT
REPLACE
(
REPLACE
(
LOAD_FILE
(
'$MYSQLD_DATADIR/test/tmp.ini'
),
'\r\n'
,
'\n'
),
'\n\n'
,
'\n'
);
--
echo
#
--
echo
# Testing bad table
--
echo
#
CREATE
TABLE
t1
(
id
INT
)
ENGINE
=
CONNECT
TABLE_TYPE
=
INI
FILE_NAME
=
't1.ini'
;
--
error
ER_GET_ERRMSG
INSERT
INTO
t1
VALUES
(
10
);
SELECT
*
FROM
t1
;
DROP
TABLE
t1
;
--
echo
#
--
echo
# Testing READONLY tables
--
echo
#
CREATE
TABLE
t1
(
contact
CHAR
(
10
)
flag
=
1
,
c2
CHAR
(
60
)
)
ENGINE
=
CONNECT
TABLE_TYPE
=
INI
FILE_NAME
=
't1.ini'
;
INSERT
INTO
t1
VALUES
(
'UK'
,
10
),(
'FR'
,
20
),(
'RU'
,
30
);
SELECT
*
FROM
t1
;
ALTER
TABLE
t1
READONLY
=
1
;
SHOW
CREATE
TABLE
t1
;
--
error
ER_OPEN_AS_READONLY
INSERT
INTO
t1
VALUES
(
'US'
,
40
);
--
error
ER_
OPEN_AS_READONLY
UPDATE
t1
SET
c2
=
20
WHERE
c2
=
10
;
--
error
ER_
OPEN_AS_READONLY
DELETE
FROM
t1
WHERE
c2
=
10
;
--
error
ER_OPEN_AS_READONLY
TRUNCATE
TABLE
t1
;
ALTER
TABLE
t1
READONLY
=
0
;
SHOW
CREATE
TABLE
t1
;
INSERT
INTO
t1
VALUES
(
'US'
,
40
);
SELECT
*
FROM
t1
;
DROP
TABLE
t1
;
--
remove_file
$MYSQLD_DATADIR
/
test
/
t1
.
ini
#
# Clean up
#
--
remove_file
$MYSQLD_DATADIR
/
test
/
contact
.
ini
--
remove_file
$MYSQLD_DATADIR
/
test
/
tmp
.
ini
--
echo
#
--
echo
# Bug: TABLE_TYPE=ini does not clear memory between CREATE TABLEs
--
echo
#
CREATE
TABLE
t1
(
sec
CHAR
(
10
)
NOT
NULL
FLAG
=
1
,
val
CHAR
(
10
)
NOT
NULL
)
ENGINE
=
CONNECT
TABLE_TYPE
=
INI
;
INSERT
INTO
t1
VALUES
(
'sec1'
,
'val1'
),(
'sec2'
,
'val2'
);
SELECT
sec
AS
s
,
val
AS
v
FROM
t1
;
DROP
TABLE
t1
;
CREATE
TABLE
t1
(
sec2
CHAR
(
10
)
NOT
NULL
FLAG
=
1
,
val2
CHAR
(
10
)
NOT
NULL
)
ENGINE
=
CONNECT
TABLE_TYPE
=
INI
;
INSERT
INTO
t1
VALUES
(
'sec1'
,
'val11'
),(
'sec2'
,
'val22'
);
SELECT
sec2
AS
s
,
val2
AS
v
FROM
t1
;
--
chmod
0777
$MYSQLD_DATADIR
/
test
/
t1
.
ini
--
replace_result
$MYSQLD_DATADIR
DATADIR
--
eval
SELECT
REPLACE
(
REPLACE
(
LOAD_FILE
(
'$MYSQLD_DATADIR/test/t1.ini'
),
'\r\n'
,
'\n'
),
'\n\n'
,
'\n'
);
DROP
TABLE
t1
;
CREATE
TABLE
t1
(
sec
CHAR
(
10
)
NOT
NULL
FLAG
=
1
,
val
CHAR
(
10
)
NOT
NULL
)
ENGINE
=
CONNECT
TABLE_TYPE
=
INI
;
CREATE
TABLE
t2
(
sec
CHAR
(
10
)
NOT
NULL
FLAG
=
1
,
val
CHAR
(
10
)
NOT
NULL
)
ENGINE
=
CONNECT
TABLE_TYPE
=
INI
;
INSERT
INTO
t1
VALUES
(
'1sec1'
,
'1val1'
),(
'1sec2'
,
'1val2'
);
INSERT
INTO
t2
VALUES
(
'2sec1'
,
'2val1'
),(
'2sec2'
,
'2val2'
);
SELECT
sec
AS
s
,
val
AS
v
FROM
t1
;
--
chmod
0777
$MYSQLD_DATADIR
/
test
/
t1
.
ini
--
replace_result
$MYSQLD_DATADIR
DATADIR
--
eval
SELECT
REPLACE
(
REPLACE
(
LOAD_FILE
(
'$MYSQLD_DATADIR/test/t1.ini'
),
'\r\n'
,
'\n'
),
'\n\n'
,
'\n'
);
SELECT
sec
AS
s
,
val
AS
v
FROM
t2
;
--
chmod
0777
$MYSQLD_DATADIR
/
test
/
t2
.
ini
--
replace_result
$MYSQLD_DATADIR
DATADIR
--
eval
SELECT
REPLACE
(
REPLACE
(
LOAD_FILE
(
'$MYSQLD_DATADIR/test/t2.ini'
),
'\r\n'
,
'\n'
),
'\n\n'
,
'\n'
);
DROP
TABLE
t1
,
t2
;
let
$MYSQLD_DATADIR
=
`select @@datadir`
;
--
copy_file
$MTR_SUITE_DIR
/
std_data
/
contact
.
ini
$MYSQLD_DATADIR
/
test
/
contact
.
ini
--
echo
#
--
echo
# Testing errors
--
echo
#
CREATE
TABLE
t1
(
ID
INT
)
Engine
=
CONNECT
TABLE_TYPE
=
INI
FILE_NAME
=
'nonexistent.txt'
;
--
replace_regex
/
on
.*
test
.
nonexistent
.
txt
/
on
DATADIR
\
/
test
\
/
nonexistent
.
txt
/
# TODO: check why this is needed for Windows
--
replace_result
Open
(
rt
)
Open
(
rb
)
SELECT
*
FROM
t1
;
DROP
TABLE
t1
;
--
echo
#
--
echo
# Testing examples from the manual
--
echo
#
CREATE
TABLE
t1
(
contact
CHAR
(
16
)
flag
=
1
,
name
CHAR
(
20
),
forename
CHAR
(
32
),
hired
date
date_format
=
'DD/MM/YYYY'
,
address
CHAR
(
64
),
city
CHAR
(
20
),
zipcode
CHAR
(
8
),
tel
CHAR
(
16
)
)
ENGINE
=
CONNECT
TABLE_TYPE
=
INI
FILE_NAME
=
'contact.ini'
;
SELECT
contact
,
name
,
hired
,
city
,
tel
FROM
t1
;
UPDATE
t1
SET
forename
=
'Harry'
where
contact
=
'UK1'
;
SELECT
*
FROM
t1
WHERE
contact
=
'UK1'
;
INSERT
INTO
t1
(
contact
,
forename
)
VALUES
(
'UK1'
,
'Harrison'
);
SELECT
*
FROM
t1
WHERE
contact
=
'UK1'
;
INSERT
INTO
t1
(
contact
,
forename
)
VALUES
(
'UK2'
,
'John'
);
SELECT
*
FROM
t1
WHERE
contact
=
'UK2'
;
DROP
TABLE
t1
;
--
chmod
0777
$MYSQLD_DATADIR
/
test
/
contact
.
ini
--
replace_result
$MYSQLD_DATADIR
DATADIR
--
eval
SELECT
REPLACE
(
REPLACE
(
LOAD_FILE
(
'$MYSQLD_DATADIR/test/contact.ini'
),
'\r\n'
,
'\n'
),
'\n\n'
,
'\n'
);
CREATE
TABLE
t1
(
section
CHAR
(
16
)
flag
=
1
,
keyname
CHAR
(
16
)
flag
=
2
,
value
CHAR
(
32
)
)
ENGINE
=
CONNECT
TABLE_TYPE
=
INI
FILE_NAME
=
'contact.ini'
OPTION_LIST
=
'Layout=Row'
;
UPDATE
t1
SET
value
=
'Paul'
WHERE
section
=
'UK2'
AND
keyname
=
'forename'
;
SELECT
*
FROM
t1
;
DROP
TABLE
t1
;
--
chmod
0777
$MYSQLD_DATADIR
/
test
/
contact
.
ini
--
replace_result
$MYSQLD_DATADIR
DATADIR
--
eval
SELECT
REPLACE
(
REPLACE
(
LOAD_FILE
(
'$MYSQLD_DATADIR/test/contact.ini'
),
'\r\n'
,
'\n'
),
'\n\n'
,
'\n'
);
--
echo
#
--
echo
# Testing that the underlying file is created
--
echo
#
CREATE
TABLE
t1
(
contact
CHAR
(
12
)
NOT
NULL
flag
=
1
,
c2
CHAR
(
12
)
NOT
NULL
)
ENGINE
=
CONNECT
TABLE_TYPE
=
INI
FILE_NAME
=
'tmp.ini'
;
INSERT
INTO
t1
VALUES
(
10
,
10
),(
20
,
20
),(
300
,
300
),(
4000
,
4000
),
(
'a b'
,
'c d'
);
SELECT
*
FROM
t1
;
DROP
TABLE
t1
;
--
chmod
0777
$MYSQLD_DATADIR
/
test
/
tmp
.
ini
--
replace_result
$MYSQLD_DATADIR
DATADIR
--
eval
SELECT
REPLACE
(
REPLACE
(
LOAD_FILE
(
'$MYSQLD_DATADIR/test/tmp.ini'
),
'\r\n'
,
'\n'
),
'\n\n'
,
'\n'
);
--
echo
#
--
echo
# Testing bad table
--
echo
#
CREATE
TABLE
t1
(
id
INT
)
ENGINE
=
CONNECT
TABLE_TYPE
=
INI
FILE_NAME
=
't1.ini'
;
--
error
ER_GET_ERRMSG
INSERT
INTO
t1
VALUES
(
10
);
SELECT
*
FROM
t1
;
DROP
TABLE
t1
;
--
echo
#
--
echo
# Testing READONLY tables
--
echo
#
CREATE
TABLE
t1
(
contact
CHAR
(
10
)
flag
=
1
,
c2
CHAR
(
60
)
)
ENGINE
=
CONNECT
TABLE_TYPE
=
INI
FILE_NAME
=
't1.ini'
;
INSERT
INTO
t1
VALUES
(
'UK'
,
10
),(
'FR'
,
20
),(
'RU'
,
30
);
SELECT
*
FROM
t1
;
ALTER
TABLE
t1
READONLY
=
1
;
SHOW
CREATE
TABLE
t1
;
--
error
ER_OPEN_AS_READONLY
INSERT
INTO
t1
VALUES
(
'US'
,
40
);
--
error
ER_
GET_ERRMSG
UPDATE
t1
SET
c2
=
20
WHERE
c2
=
10
;
--
error
ER_
GET_ERRMSG
DELETE
FROM
t1
WHERE
c2
=
10
;
--
error
ER_OPEN_AS_READONLY
TRUNCATE
TABLE
t1
;
ALTER
TABLE
t1
READONLY
=
0
;
SHOW
CREATE
TABLE
t1
;
INSERT
INTO
t1
VALUES
(
'US'
,
40
);
SELECT
*
FROM
t1
;
DROP
TABLE
t1
;
--
remove_file
$MYSQLD_DATADIR
/
test
/
t1
.
ini
#
# Clean up
#
--
remove_file
$MYSQLD_DATADIR
/
test
/
contact
.
ini
--
remove_file
$MYSQLD_DATADIR
/
test
/
tmp
.
ini
--
echo
#
--
echo
# Bug: TABLE_TYPE=ini does not clear memory between CREATE TABLEs
--
echo
#
CREATE
TABLE
t1
(
sec
CHAR
(
10
)
NOT
NULL
FLAG
=
1
,
val
CHAR
(
10
)
NOT
NULL
)
ENGINE
=
CONNECT
TABLE_TYPE
=
INI
;
INSERT
INTO
t1
VALUES
(
'sec1'
,
'val1'
),(
'sec2'
,
'val2'
);
SELECT
sec
AS
s
,
val
AS
v
FROM
t1
;
DROP
TABLE
t1
;
CREATE
TABLE
t1
(
sec2
CHAR
(
10
)
NOT
NULL
FLAG
=
1
,
val2
CHAR
(
10
)
NOT
NULL
)
ENGINE
=
CONNECT
TABLE_TYPE
=
INI
;
INSERT
INTO
t1
VALUES
(
'sec1'
,
'val11'
),(
'sec2'
,
'val22'
);
SELECT
sec2
AS
s
,
val2
AS
v
FROM
t1
;
--
chmod
0777
$MYSQLD_DATADIR
/
test
/
t1
.
ini
--
replace_result
$MYSQLD_DATADIR
DATADIR
--
eval
SELECT
REPLACE
(
REPLACE
(
LOAD_FILE
(
'$MYSQLD_DATADIR/test/t1.ini'
),
'\r\n'
,
'\n'
),
'\n\n'
,
'\n'
);
DROP
TABLE
t1
;
CREATE
TABLE
t1
(
sec
CHAR
(
10
)
NOT
NULL
FLAG
=
1
,
val
CHAR
(
10
)
NOT
NULL
)
ENGINE
=
CONNECT
TABLE_TYPE
=
INI
;
CREATE
TABLE
t2
(
sec
CHAR
(
10
)
NOT
NULL
FLAG
=
1
,
val
CHAR
(
10
)
NOT
NULL
)
ENGINE
=
CONNECT
TABLE_TYPE
=
INI
;
INSERT
INTO
t1
VALUES
(
'1sec1'
,
'1val1'
),(
'1sec2'
,
'1val2'
);
INSERT
INTO
t2
VALUES
(
'2sec1'
,
'2val1'
),(
'2sec2'
,
'2val2'
);
SELECT
sec
AS
s
,
val
AS
v
FROM
t1
;
--
chmod
0777
$MYSQLD_DATADIR
/
test
/
t1
.
ini
--
replace_result
$MYSQLD_DATADIR
DATADIR
--
eval
SELECT
REPLACE
(
REPLACE
(
LOAD_FILE
(
'$MYSQLD_DATADIR/test/t1.ini'
),
'\r\n'
,
'\n'
),
'\n\n'
,
'\n'
);
SELECT
sec
AS
s
,
val
AS
v
FROM
t2
;
--
chmod
0777
$MYSQLD_DATADIR
/
test
/
t2
.
ini
--
replace_result
$MYSQLD_DATADIR
DATADIR
--
eval
SELECT
REPLACE
(
REPLACE
(
LOAD_FILE
(
'$MYSQLD_DATADIR/test/t2.ini'
),
'\r\n'
,
'\n'
),
'\n\n'
,
'\n'
);
DROP
TABLE
t1
,
t2
;
storage/connect/mysql-test/connect/t/vec.test
View file @
094b01d4
let
$MYSQLD_DATADIR
=
`select @@datadir`
;
CREATE
TABLE
dir1
(
spath
VARCHAR
(
256
)
NOT
NULL
flag
=
1
,
fname
VARCHAR
(
256
)
NOT
NULL
,
ftype
CHAR
(
4
)
NOT
NULL
,
size
DOUBLE
(
12
,
0
)
NOT
NULL
flag
=
5
)
ENGINE
=
CONNECT
TABLE_TYPE
=
DIR
FILE_NAME
=
'*vec*'
;
CREATE
TABLE
t1
(
a
INT
NOT
NULL
,
b
CHAR
(
10
)
NOT
NULL
)
ENGINE
=
CONNECT
TABLE_TYPE
=
VEC
FILE_NAME
=
't1vec'
;
SHOW
CREATE
TABLE
t1
;
# Testing SELECT on empty file
--
replace_regex
/
Open
.
rb
.
error
2
on
.*
\
/
test
\
/
t1vec
/
Open
(
rb
)
error
2
on
DATADIR
\
/
test
\
/
t1vec
/
SELECT
*
FROM
t1
;
INSERT
INTO
t1
VALUES
(
0
,
'test01'
),
(
1
,
'test01'
),
(
2
,
'test02'
),
(
3
,
'test03'
);
SELECT
*
FROM
t1
;
SELECT
a
FROM
t1
;
SELECT
b
FROM
t1
;
--
replace_result
$MYSQLD_DATADIR
DATADIR
/
SELECT
fname
,
ftype
,
size
FROM
dir1
ORDER
BY
fname
,
ftype
;
DROP
TABLE
t1
;
--
remove_file
$MYSQLD_DATADIR
/
test
/
t1vec1
--
remove_file
$MYSQLD_DATADIR
/
test
/
t1vec2
CREATE
TABLE
t1
(
a
INT
NOT
NULL
,
b
CHAR
(
10
)
NOT
NULL
)
ENGINE
=
CONNECT
TABLE_TYPE
=
VEC
FILE_NAME
=
't1vec'
MAX_ROWS
=
10
;
SHOW
CREATE
TABLE
t1
;
# Testing SELECTs on empty file
--
replace_regex
/
Open
.
rb
.
error
2
on
.*
\
/
test
\
/
t1vec
/
Open
(
rb
)
error
2
on
DATADIR
\
/
test
\
/
t1vec
/
SELECT
*
FROM
t1
;
--
replace_regex
/
Open
.
rb
.
error
2
on
.*
\
/
test
\
/
t1vec
/
Open
(
rb
)
error
2
on
DATADIR
\
/
test
\
/
t1vec
/
SELECT
a
FROM
t1
;
--
replace_regex
/
Open
.
rb
.
error
2
on
.*
\
/
test
\
/
t1vec
/
Open
(
rb
)
error
2
on
DATADIR
\
/
test
\
/
t1vec
/
SELECT
b
FROM
t1
;
INSERT
INTO
t1
VALUES
(
0
,
'test01'
),
(
1
,
'test01'
),
(
2
,
'test02'
),
(
3
,
'test03'
);
SELECT
*
FROM
t1
;
SELECT
a
FROM
t1
;
SELECT
b
FROM
t1
;
--
replace_result
$MYSQLD_DATADIR
DATADIR
/
SELECT
fname
,
ftype
,
size
FROM
dir1
ORDER
BY
fname
,
ftype
;
--
echo
#
--
echo
# Testing READONLY
--
echo
#
ALTER
TABLE
t1
READONLY
=
yes
;
SHOW
CREATE
TABLE
t1
;
--
error
ER_OPEN_AS_READONLY
INSERT
INTO
t1
VALUES
(
4
,
'test04'
);
--
error
ER_
OPEN_AS_READONLY
UPDATE
t1
SET
b
=
'test04'
WHERE
a
=
3
;
--
error
ER_
OPEN_AS_READONLY
DELETE
FROM
t1
WHERE
a
=
3
;
--
error
ER_OPEN_AS_READONLY
TRUNCATE
TABLE
t1
;
ALTER
TABLE
t1
READONLY
=
no
;
SHOW
CREATE
TABLE
t1
;
INSERT
INTO
t1
VALUES
(
4
,
'test04'
);
UPDATE
t1
SET
b
=
'test04a'
WHERE
a
=
4
;
DELETE
FROM
t1
WHERE
a
=
0
;
SELECT
*
FROM
t1
;
TRUNCATE
TABLE
t1
;
SELECT
fname
,
ftype
,
size
FROM
dir1
ORDER
BY
fname
,
ftype
;
SELECT
*
FROM
t1
;
DROP
TABLE
t1
;
--
remove_file
$MYSQLD_DATADIR
/
test
/
t1vec
--
remove_file
$MYSQLD_DATADIR
/
test
/
t1vec
.
blk
--
echo
#
--
echo
# Clean up
--
echo
#
DROP
TABLE
dir1
;
let
$MYSQLD_DATADIR
=
`select @@datadir`
;
CREATE
TABLE
dir1
(
spath
VARCHAR
(
256
)
NOT
NULL
flag
=
1
,
fname
VARCHAR
(
256
)
NOT
NULL
,
ftype
CHAR
(
4
)
NOT
NULL
,
size
DOUBLE
(
12
,
0
)
NOT
NULL
flag
=
5
)
ENGINE
=
CONNECT
TABLE_TYPE
=
DIR
FILE_NAME
=
'*vec*'
;
CREATE
TABLE
t1
(
a
INT
NOT
NULL
,
b
CHAR
(
10
)
NOT
NULL
)
ENGINE
=
CONNECT
TABLE_TYPE
=
VEC
FILE_NAME
=
't1vec'
;
SHOW
CREATE
TABLE
t1
;
# Testing SELECT on empty file
--
replace_regex
/
Open
.
rb
.
error
2
on
.*
\
/
test
\
/
t1vec
/
Open
(
rb
)
error
2
on
DATADIR
\
/
test
\
/
t1vec
/
SELECT
*
FROM
t1
;
INSERT
INTO
t1
VALUES
(
0
,
'test01'
),
(
1
,
'test01'
),
(
2
,
'test02'
),
(
3
,
'test03'
);
SELECT
*
FROM
t1
;
SELECT
a
FROM
t1
;
SELECT
b
FROM
t1
;
--
replace_result
$MYSQLD_DATADIR
DATADIR
/
SELECT
fname
,
ftype
,
size
FROM
dir1
ORDER
BY
fname
,
ftype
;
DROP
TABLE
t1
;
--
remove_file
$MYSQLD_DATADIR
/
test
/
t1vec1
--
remove_file
$MYSQLD_DATADIR
/
test
/
t1vec2
CREATE
TABLE
t1
(
a
INT
NOT
NULL
,
b
CHAR
(
10
)
NOT
NULL
)
ENGINE
=
CONNECT
TABLE_TYPE
=
VEC
FILE_NAME
=
't1vec'
MAX_ROWS
=
10
;
SHOW
CREATE
TABLE
t1
;
# Testing SELECTs on empty file
--
replace_regex
/
Open
.
rb
.
error
2
on
.*
\
/
test
\
/
t1vec
/
Open
(
rb
)
error
2
on
DATADIR
\
/
test
\
/
t1vec
/
SELECT
*
FROM
t1
;
--
replace_regex
/
Open
.
rb
.
error
2
on
.*
\
/
test
\
/
t1vec
/
Open
(
rb
)
error
2
on
DATADIR
\
/
test
\
/
t1vec
/
SELECT
a
FROM
t1
;
--
replace_regex
/
Open
.
rb
.
error
2
on
.*
\
/
test
\
/
t1vec
/
Open
(
rb
)
error
2
on
DATADIR
\
/
test
\
/
t1vec
/
SELECT
b
FROM
t1
;
INSERT
INTO
t1
VALUES
(
0
,
'test01'
),
(
1
,
'test01'
),
(
2
,
'test02'
),
(
3
,
'test03'
);
SELECT
*
FROM
t1
;
SELECT
a
FROM
t1
;
SELECT
b
FROM
t1
;
--
replace_result
$MYSQLD_DATADIR
DATADIR
/
SELECT
fname
,
ftype
,
size
FROM
dir1
ORDER
BY
fname
,
ftype
;
--
echo
#
--
echo
# Testing READONLY
--
echo
#
ALTER
TABLE
t1
READONLY
=
yes
;
SHOW
CREATE
TABLE
t1
;
--
error
ER_OPEN_AS_READONLY
INSERT
INTO
t1
VALUES
(
4
,
'test04'
);
--
error
ER_
GET_ERRMSG
UPDATE
t1
SET
b
=
'test04'
WHERE
a
=
3
;
--
error
ER_
GET_ERRMSG
DELETE
FROM
t1
WHERE
a
=
3
;
--
error
ER_OPEN_AS_READONLY
TRUNCATE
TABLE
t1
;
ALTER
TABLE
t1
READONLY
=
no
;
SHOW
CREATE
TABLE
t1
;
INSERT
INTO
t1
VALUES
(
4
,
'test04'
);
UPDATE
t1
SET
b
=
'test04a'
WHERE
a
=
4
;
DELETE
FROM
t1
WHERE
a
=
0
;
SELECT
*
FROM
t1
;
TRUNCATE
TABLE
t1
;
SELECT
fname
,
ftype
,
size
FROM
dir1
ORDER
BY
fname
,
ftype
;
SELECT
*
FROM
t1
;
DROP
TABLE
t1
;
--
remove_file
$MYSQLD_DATADIR
/
test
/
t1vec
--
remove_file
$MYSQLD_DATADIR
/
test
/
t1vec
.
blk
--
echo
#
--
echo
# Clean up
--
echo
#
DROP
TABLE
dir1
;
storage/connect/reldef.h
View file @
094b01d4
...
...
@@ -195,6 +195,8 @@ class DllExport COLDEF : public COLCRT { /* Column description block
int
GetPoff
(
void
)
{
return
Poff
;}
int
Define
(
PGLOBAL
g
,
void
*
memp
,
PCOLINFO
cfp
,
int
poff
);
void
Define
(
PGLOBAL
g
,
PCOL
colp
);
bool
IsSpecial
(
void
)
{
return
(
Flags
&
U_SPECIAL
)
?
true
:
false
;}
bool
IsVirtual
(
void
)
{
return
(
Flags
&
U_VIRTUAL
)
?
true
:
false
;}
protected:
int
Buf_Type
;
/* Internal data type */
...
...
storage/connect/tabdos.cpp
View file @
094b01d4
...
...
@@ -924,10 +924,12 @@ DOSCOL::DOSCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PSZ am)
Long
=
cdp
->
GetLong
();
To_Val
=
NULL
;
OldVal
=
NULL
;
// Currently used only in MinMax
Dsp
=
0
;
Ldz
=
false
;
Nod
=
false
;
Dcm
=
-
1
;
p
=
cdp
->
GetFmt
();
Buf
=
NULL
;
if
(
p
&&
IsTypeNum
(
Buf_Type
))
{
// Formatted numeric value
...
...
@@ -939,6 +941,9 @@ DOSCOL::DOSCOL(PGLOBAL g, PCOLDEF cdp, PTDB tp, PCOL cp, int i, PSZ am)
case
'N'
:
// Have no decimal point
Nod
=
true
;
break
;
case
'D'
:
// Decimal separator
Dsp
=
*
(
++
p
);
break
;
}
// endswitch p
// Set number of decimal digits
...
...
@@ -960,6 +965,7 @@ DOSCOL::DOSCOL(DOSCOL *col1, PTDB tdbp) : COLBLK(col1, tdbp)
Long
=
col1
->
Long
;
To_Val
=
col1
->
To_Val
;
Ldz
=
col1
->
Ldz
;
Dsp
=
col1
->
Dsp
;
Nod
=
col1
->
Nod
;
Dcm
=
col1
->
Dcm
;
OldVal
=
col1
->
OldVal
;
...
...
@@ -1003,7 +1009,7 @@ bool DOSCOL::SetBuffer(PGLOBAL g, PVAL value, bool ok, bool check)
}
// endif's Value, Buf_Type
// Allocate the buffer used in WriteColumn for numeric columns
if
(
IsTypeNum
(
Buf_Type
))
if
(
!
Buf
&&
IsTypeNum
(
Buf_Type
))
Buf
=
(
char
*
)
PlugSubAlloc
(
g
,
NULL
,
MY_MAX
(
32
,
Long
+
Dcm
+
1
));
// Because Colblk's have been made from a copy of the original TDB in
...
...
@@ -1048,14 +1054,18 @@ void DOSCOL::ReadColumn(PGLOBAL g)
p
=
tdbp
->
To_Line
+
Deplac
;
field
=
Long
;
/*********************************************************************/
/* For a variable length file, check if the field exists. */
/*********************************************************************/
if
(
tdbp
->
Ftype
==
RECFM_VAR
&&
strlen
(
tdbp
->
To_Line
)
<
(
unsigned
)
Deplac
)
field
=
0
;
else
if
(
Dsp
)
for
(
i
=
0
;
i
<
field
;
i
++
)
if
(
p
[
i
]
==
Dsp
)
p
[
i
]
=
'.'
;
switch
(
tdbp
->
Ftype
)
{
case
RECFM_VAR
:
/*****************************************************************/
/* For a variable length file, check if the field exists. */
/*****************************************************************/
if
(
strlen
(
tdbp
->
To_Line
)
<
(
unsigned
)
Deplac
)
field
=
0
;
case
RECFM_FIX
:
// Fixed length text file
case
RECFM_DBF
:
// Fixed length DBase file
if
(
Nod
)
switch
(
Buf_Type
)
{
...
...
@@ -1184,6 +1194,7 @@ void DOSCOL::WriteColumn(PGLOBAL g)
len
=
sprintf
(
Buf
,
fmt
,
field
-
i
,
Value
->
GetTinyValue
());
break
;
case
TYPE_DOUBLE
:
case
TYPE_DECIM
:
strcpy
(
fmt
,
(
Ldz
)
?
"%0*.*lf"
:
"%*.*lf"
);
sprintf
(
Buf
,
fmt
,
field
+
((
Nod
&&
Dcm
)
?
1
:
0
),
Dcm
,
Value
->
GetFloatValue
());
...
...
@@ -1192,7 +1203,7 @@ void DOSCOL::WriteColumn(PGLOBAL g)
if
(
Nod
&&
Dcm
)
for
(
i
=
k
=
0
;
i
<
len
;
i
++
,
k
++
)
if
(
Buf
[
i
]
!=
' '
)
{
if
(
Buf
[
i
]
==
'.'
||
Buf
[
i
]
==
','
)
if
(
Buf
[
i
]
==
'.'
)
k
++
;
Buf
[
i
]
=
Buf
[
k
];
...
...
@@ -1200,10 +1211,13 @@ void DOSCOL::WriteColumn(PGLOBAL g)
len
=
strlen
(
Buf
);
break
;
default:
sprintf
(
g
->
Message
,
"Invalid field format for column %s"
,
Name
);
longjmp
(
g
->
jumper
[
g
->
jump_level
],
31
);
}
// endswitch BufType
p2
=
Buf
;
}
else
// Standard
PlugDB
format
}
else
// Standard
CONNECT
format
p2
=
Value
->
ShowValue
(
Buf
,
field
);
if
(
trace
)
...
...
@@ -1212,7 +1226,10 @@ void DOSCOL::WriteColumn(PGLOBAL g)
if
((
len
=
strlen
(
p2
))
>
field
)
{
sprintf
(
g
->
Message
,
MSG
(
VALUE_TOO_LONG
),
p2
,
Name
,
field
);
longjmp
(
g
->
jumper
[
g
->
jump_level
],
31
);
}
// endif
}
else
if
(
Dsp
)
for
(
i
=
0
;
i
<
len
;
i
++
)
if
(
p2
[
i
]
==
'.'
)
p2
[
i
]
=
Dsp
;
if
(
trace
>
1
)
htrc
(
"buffer=%s
\n
"
,
p2
);
...
...
storage/connect/tabdos.h
View file @
094b01d4
...
...
@@ -193,7 +193,8 @@ class DllExport DOSCOL : public COLBLK {
// Members
PVAL
To_Val
;
// To value used for Update/Insert
PVAL
OldVal
;
// The previous value of the object.
char
*
Buf
;
// Buffer used in write operations
char
*
Buf
;
// Buffer used in read/write operations
char
Dsp
;
// The decimal separator
bool
Ldz
;
// True if field contains leading zeros
bool
Nod
;
// True if no decimal point
int
Dcm
;
// Last Dcm digits are decimals
...
...
storage/connect/tabfmt.cpp
View file @
094b01d4
...
...
@@ -406,7 +406,7 @@ bool CSVDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff)
// Double check correctness of offset values
if
(
Catfunc
==
FNC_NO
)
for
(
PCOLDEF
cdp
=
To_Cols
;
cdp
;
cdp
=
cdp
->
GetNext
())
if
(
cdp
->
GetOffset
()
<
1
)
{
if
(
cdp
->
GetOffset
()
<
1
&&
!
cdp
->
IsSpecial
()
)
{
strcpy
(
g
->
Message
,
MSG
(
BAD_OFFSET_VAL
));
return
true
;
}
// endif Offset
...
...
@@ -598,7 +598,7 @@ int TDBCSV::EstimatedLength(PGLOBAL g)
PCSVCOL
colp
;
for
(
colp
=
(
PCSVCOL
)
Columns
;
colp
;
colp
=
(
PCSVCOL
)
colp
->
Next
)
if
(
!
colp
->
IsSpecial
()
)
// Not a pseudo
column
if
(
!
colp
->
IsSpecial
()
&&
!
colp
->
IsVirtual
())
// A true
column
Fields
=
MY_MAX
(
Fields
,
(
int
)
colp
->
Fldnum
);
if
(
Columns
)
...
...
@@ -641,7 +641,7 @@ bool TDBCSV::OpenDB(PGLOBAL g)
if
(
!
Fields
)
// May have been set in TABFMT::OpenDB
if
(
Mode
!=
MODE_UPDATE
&&
Mode
!=
MODE_INSERT
)
{
for
(
colp
=
(
PCSVCOL
)
Columns
;
colp
;
colp
=
(
PCSVCOL
)
colp
->
Next
)
if
(
!
colp
->
IsSpecial
()
)
// Not a pseudo column
if
(
!
colp
->
IsSpecial
()
&&
!
colp
->
IsVirtual
())
Fields
=
MY_MAX
(
Fields
,
(
int
)
colp
->
Fldnum
);
if
(
Columns
)
...
...
@@ -649,7 +649,8 @@ bool TDBCSV::OpenDB(PGLOBAL g)
}
else
for
(
cdp
=
tdp
->
GetCols
();
cdp
;
cdp
=
cdp
->
GetNext
())
Fields
++
;
if
(
!
cdp
->
IsVirtual
())
Fields
++
;
Offset
=
(
int
*
)
PlugSubAlloc
(
g
,
NULL
,
sizeof
(
int
)
*
Fields
);
Fldlen
=
(
int
*
)
PlugSubAlloc
(
g
,
NULL
,
sizeof
(
int
)
*
Fields
);
...
...
@@ -672,25 +673,27 @@ bool TDBCSV::OpenDB(PGLOBAL g)
if
(
Field
)
// Prepare writing fields
if
(
Mode
!=
MODE_UPDATE
)
for
(
colp
=
(
PCSVCOL
)
Columns
;
colp
;
colp
=
(
PCSVCOL
)
colp
->
Next
)
{
i
=
colp
->
Fldnum
;
len
=
colp
->
GetLength
();
Field
[
i
]
=
(
PSZ
)
PlugSubAlloc
(
g
,
NULL
,
len
+
1
);
Field
[
i
][
len
]
=
'\0'
;
Fldlen
[
i
]
=
len
;
Fldtyp
[
i
]
=
IsTypeNum
(
colp
->
GetResultType
());
}
// endfor colp
else
// MODE_UPDATE
for
(
cdp
=
tdp
->
GetCols
();
cdp
;
cdp
=
cdp
->
GetNext
())
{
i
=
cdp
->
GetOffset
()
-
1
;
len
=
cdp
->
GetLength
();
Field
[
i
]
=
(
PSZ
)
PlugSubAlloc
(
g
,
NULL
,
len
+
1
);
Field
[
i
][
len
]
=
'\0'
;
Fldlen
[
i
]
=
len
;
Fldtyp
[
i
]
=
IsTypeNum
(
cdp
->
GetType
());
}
// endfor colp
if
(
Mode
!=
MODE_UPDATE
)
{
for
(
colp
=
(
PCSVCOL
)
Columns
;
colp
;
colp
=
(
PCSVCOL
)
colp
->
Next
)
if
(
!
colp
->
IsSpecial
()
&&
!
colp
->
IsVirtual
())
{
i
=
colp
->
Fldnum
;
len
=
colp
->
GetLength
();
Field
[
i
]
=
(
PSZ
)
PlugSubAlloc
(
g
,
NULL
,
len
+
1
);
Field
[
i
][
len
]
=
'\0'
;
Fldlen
[
i
]
=
len
;
Fldtyp
[
i
]
=
IsTypeNum
(
colp
->
GetResultType
());
}
// endif colp
}
else
// MODE_UPDATE
for
(
cdp
=
tdp
->
GetCols
();
cdp
;
cdp
=
cdp
->
GetNext
())
if
(
!
cdp
->
IsVirtual
())
{
i
=
cdp
->
GetOffset
()
-
1
;
len
=
cdp
->
GetLength
();
Field
[
i
]
=
(
PSZ
)
PlugSubAlloc
(
g
,
NULL
,
len
+
1
);
Field
[
i
][
len
]
=
'\0'
;
Fldlen
[
i
]
=
len
;
Fldtyp
[
i
]
=
IsTypeNum
(
cdp
->
GetType
());
}
// endif cdp
}
// endif Use
...
...
@@ -1101,7 +1104,7 @@ bool TDBFMT::OpenDB(PGLOBAL g)
PDOSDEF
tdp
=
(
PDOSDEF
)
To_Def
;
for
(
colp
=
(
PCSVCOL
)
Columns
;
colp
;
colp
=
(
PCSVCOL
)
colp
->
Next
)
if
(
!
colp
->
IsSpecial
()
)
// Not a pseudo
column
if
(
!
colp
->
IsSpecial
()
&&
!
colp
->
IsVirtual
())
// a true
column
Fields
=
MY_MAX
(
Fields
,
(
int
)
colp
->
Fldnum
);
if
(
Columns
)
...
...
@@ -1115,7 +1118,7 @@ bool TDBFMT::OpenDB(PGLOBAL g)
// Get the column formats
for
(
cdp
=
tdp
->
GetCols
();
cdp
;
cdp
=
cdp
->
GetNext
())
if
((
i
=
cdp
->
GetOffset
()
-
1
)
<
Fields
)
{
if
(
!
cdp
->
IsVirtual
()
&&
(
i
=
cdp
->
GetOffset
()
-
1
)
<
Fields
)
{
if
(
!
(
pfm
=
cdp
->
GetFmt
()))
{
sprintf
(
g
->
Message
,
MSG
(
NO_FLD_FORMAT
),
i
+
1
,
Name
);
return
true
;
...
...
@@ -1318,6 +1321,11 @@ void CSVCOL::ReadColumn(PGLOBAL g)
// Field have been copied in TDB Field array
PSZ
fp
=
tdbp
->
Field
[
Fldnum
];
if
(
Dsp
)
for
(
int
i
=
0
;
fp
[
i
];
i
++
)
if
(
fp
[
i
]
==
Dsp
)
fp
[
i
]
=
'.'
;
Value
->
SetValue_psz
(
fp
);
// Set null when applicable
...
...
@@ -1365,7 +1373,10 @@ void CSVCOL::WriteColumn(PGLOBAL g)
sprintf
(
g
->
Message
,
MSG
(
BAD_FLD_LENGTH
),
Name
,
p
,
flen
,
tdbp
->
RowNumber
(
g
),
tdbp
->
GetFile
(
g
));
longjmp
(
g
->
jumper
[
g
->
jump_level
],
34
);
}
// endif
}
else
if
(
Dsp
)
for
(
int
i
=
0
;
p
[
i
];
i
++
)
if
(
p
[
i
]
==
'.'
)
p
[
i
]
=
Dsp
;
if
(
trace
>
1
)
htrc
(
"buffer=%s
\n
"
,
p
);
...
...
storage/connect/tabmysql.cpp
View file @
094b01d4
...
...
@@ -191,8 +191,7 @@ bool MYSQLDEF::ParseURL(PGLOBAL g, char *url, bool b)
}
else
// Otherwise, straight server name,
// use tablename of federatedx table as remote table name
Tabname
=
Name
;
Tabname
=
(
b
)
?
GetStringCatInfo
(
g
,
"Tabname"
,
Name
)
:
NULL
;
if
(
trace
)
htrc
(
"server: %s Tabname: %s"
,
url
,
Tabname
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment