Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
ce8199a4
Commit
ce8199a4
authored
Jan 08, 2008
by
James Hawkins
Committed by
Alexandre Julliard
Jan 09, 2008
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
msi: Handle markers in the WHERE section of an UPDATE query, with tests.
parent
272fb14e
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
105 additions
and
6 deletions
+105
-6
db.c
dlls/msi/tests/db.c
+67
-0
update.c
dlls/msi/update.c
+38
-6
No files found.
dlls/msi/tests/db.c
View file @
ce8199a4
...
...
@@ -3777,6 +3777,73 @@ static void test_update(void)
ok
(
r
==
ERROR_SUCCESS
,
"MsiViewClose failed
\n
"
);
r
=
MsiCloseHandle
(
view
);
ok
(
r
==
ERROR_SUCCESS
,
"MsiCloseHandle failed
\n
"
);
query
=
"CREATE TABLE `Apple` ( `Banana` CHAR(72) NOT NULL, "
"`Orange` CHAR(72), `Pear` INT PRIMARY KEY `Banana`)"
;
r
=
run_query
(
hdb
,
0
,
query
);
ok
(
r
==
ERROR_SUCCESS
,
"Expected ERROR_SUCCESS, got %d
\n
"
,
r
);
query
=
"INSERT INTO `Apple` ( `Banana`, `Orange`, `Pear` )"
"VALUES('one', 'two', 3)"
;
r
=
run_query
(
hdb
,
0
,
query
);
ok
(
r
==
ERROR_SUCCESS
,
"Expected ERROR_SUCCESS, got %d
\n
"
,
r
);
query
=
"INSERT INTO `Apple` ( `Banana`, `Orange`, `Pear` )"
"VALUES('three', 'four', 5)"
;
r
=
run_query
(
hdb
,
0
,
query
);
ok
(
r
==
ERROR_SUCCESS
,
"Expected ERROR_SUCCESS, got %d
\n
"
,
r
);
query
=
"INSERT INTO `Apple` ( `Banana`, `Orange`, `Pear` )"
"VALUES('six', 'two', 7)"
;
r
=
run_query
(
hdb
,
0
,
query
);
ok
(
r
==
ERROR_SUCCESS
,
"Expected ERROR_SUCCESS, got %d
\n
"
,
r
);
rec
=
MsiCreateRecord
(
2
);
MsiRecordSetInteger
(
rec
,
1
,
8
);
MsiRecordSetString
(
rec
,
2
,
"two"
);
query
=
"UPDATE `Apple` SET `Pear` = ? WHERE `Orange` = ?"
;
r
=
run_query
(
hdb
,
rec
,
query
);
ok
(
r
==
ERROR_SUCCESS
,
"Expected ERROR_SUCCESS, got %d
\n
"
,
r
);
MsiCloseHandle
(
rec
);
query
=
"SELECT `Pear` FROM `Apple` ORDER BY `Orange`"
;
r
=
MsiDatabaseOpenView
(
hdb
,
query
,
&
view
);
ok
(
r
==
ERROR_SUCCESS
,
"Expected ERROR_SUCCESS, got %d
\n
"
,
r
);
r
=
MsiViewExecute
(
view
,
0
);
ok
(
r
==
ERROR_SUCCESS
,
"Expected ERROR_SUCCESS, got %d
\n
"
,
r
);
r
=
MsiViewFetch
(
view
,
&
rec
);
ok
(
r
==
ERROR_SUCCESS
,
"Expected ERROR_SUCCESS, got %d
\n
"
,
r
);
r
=
MsiRecordGetInteger
(
rec
,
1
);
ok
(
r
==
8
,
"Expected 8, got %d
\n
"
,
r
);
MsiCloseHandle
(
rec
);
r
=
MsiViewFetch
(
view
,
&
rec
);
ok
(
r
==
ERROR_SUCCESS
,
"Expected ERROR_SUCCESS, got %d
\n
"
,
r
);
r
=
MsiRecordGetInteger
(
rec
,
1
);
ok
(
r
==
8
,
"Expected 8, got %d
\n
"
,
r
);
MsiCloseHandle
(
rec
);
r
=
MsiViewFetch
(
view
,
&
rec
);
ok
(
r
==
ERROR_SUCCESS
,
"Expected ERROR_SUCCESS, got %d
\n
"
,
r
);
r
=
MsiRecordGetInteger
(
rec
,
1
);
ok
(
r
==
5
,
"Expected 5, got %d
\n
"
,
r
);
MsiCloseHandle
(
rec
);
r
=
MsiViewFetch
(
view
,
&
rec
);
ok
(
r
==
ERROR_NO_MORE_ITEMS
,
"Expectd ERROR_NO_MORE_ITEMS, got %d
\n
"
,
r
);
MsiViewClose
(
view
);
MsiCloseHandle
(
view
);
r
=
MsiDatabaseCommit
(
hdb
);
ok
(
r
==
ERROR_SUCCESS
,
"MsiDatabaseCommit failed
\n
"
);
r
=
MsiCloseHandle
(
hdb
);
...
...
dlls/msi/update.c
View file @
ce8199a4
...
...
@@ -60,26 +60,56 @@ static UINT UPDATE_execute( struct tagMSIVIEW *view, MSIRECORD *record )
MSIUPDATEVIEW
*
uv
=
(
MSIUPDATEVIEW
*
)
view
;
UINT
i
,
r
,
col_count
=
0
,
row_count
=
0
;
MSIRECORD
*
values
=
NULL
;
MSIRECORD
*
where
=
NULL
;
MSIVIEW
*
wv
;
UINT
cols_count
,
where_count
;
column_info
*
col
=
uv
->
vals
;
TRACE
(
"%p %p
\n
"
,
uv
,
record
);
/* extract the where markers from the record */
if
(
record
)
{
r
=
MSI_RecordGetFieldCount
(
record
);
for
(
i
=
0
;
col
;
col
=
col
->
next
)
i
++
;
cols_count
=
i
;
where_count
=
r
-
i
;
if
(
where_count
>
0
)
{
where
=
MSI_CreateRecord
(
where_count
);
if
(
where
)
for
(
i
=
1
;
i
<=
where_count
;
i
++
)
MSI_RecordCopyField
(
record
,
cols_count
+
i
,
where
,
i
);
}
}
wv
=
uv
->
wv
;
if
(
!
wv
)
return
ERROR_FUNCTION_FAILED
;
{
r
=
ERROR_FUNCTION_FAILED
;
goto
done
;
}
r
=
wv
->
ops
->
execute
(
wv
,
0
);
r
=
wv
->
ops
->
execute
(
wv
,
where
);
TRACE
(
"tv execute returned %x
\n
"
,
r
);
if
(
r
)
return
r
;
goto
done
;
r
=
wv
->
ops
->
get_dimensions
(
wv
,
&
row_count
,
&
col_count
);
if
(
r
)
return
r
;
goto
done
;
values
=
msi_query_merge_record
(
col_count
,
uv
->
vals
,
record
);
if
(
!
values
)
return
ERROR_FUNCTION_FAILED
;
{
r
=
ERROR_FUNCTION_FAILED
;
goto
done
;
}
for
(
i
=
0
;
i
<
row_count
;
i
++
)
{
...
...
@@ -88,7 +118,9 @@ static UINT UPDATE_execute( struct tagMSIVIEW *view, MSIRECORD *record )
break
;
}
msiobj_release
(
&
values
->
hdr
);
done:
if
(
where
)
msiobj_release
(
&
where
->
hdr
);
if
(
values
)
msiobj_release
(
&
values
->
hdr
);
return
r
;
}
...
...
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