[Gambas-user] import mysql dump EXEC or SHELL?
Doriano Blengino
doriano.blengino at ...1909...
Wed Dec 17 07:27:48 CET 2008
Ron_1st ha scritto:
> On Tuesday 16 December 2008, Doriano Blengino wrote:
>
>> Ron_1st ha scritto:
>>
>>> On Tuesday 16 December 2008, wig wrote:
>>>
>>>
>>>> sImport = "< " & Application.Path & "/mytables.sql"
>>>>
>>>> EXEC ["mysql", sUser, sPassword, sHost, sDatabase, sImport]
>>>>
>>>>
>>>>
>>> sImport = "< "
>>> sSqlFile = Application.Path & "/mytables.sql"
>>>
>>> EXEC ["mysql", sUser, sPassword, sHost, sDatabase, sImport, sSqlFile ]
>>>
>>> Every item on the line for EXEC should be a seprate item in the array.
>>> The "<" is a seperate item/part of the line, it has space on both adjacent sides!
>>>
>>>
>> No,
>>
>> the "<" construct is a shell construct, not a linux/unix one. It is
>> /bin/sh, or whatever, which interprets this notation and does a lot of
>> job about it.
>> The gambas SHELL instruction calls /bin/sh, which is powerful
>> (environment, PATH search, redirection and much more), so you can use
>> all its features.
>>
>>
>>
> When I do understand it correct the error in the line
>
>>> EXEC ["mysql", sUser, sPassword, sHost, sDatabase, sImport, sSqlFile ]
>>>
> is the missing path for "mysql" (?)
>
Pardon me. I got confused about the exec system call.
I went to read the documentation, and made a simple test. EXEC finds the
normal executables, in some way; so this is not the problem.
Your problem is that you can not do redirection using "<". It is the
shell /bin/sh that does that; if you use such character in an EXEC
statement, all you obtain is to pass the "<" character to the command
you are invoking which, 99% of the times, will interpret it as a file
name or part of it.
You can do what you want do by this:
dim sql_result as string
SHELL "mysql -u user01 -p pwd01 ... < " & Application.Path &/
"mytables.sql" TO sql_result
The "to sql_result" implies that the command is fully executed before
returning, and you can analyze the string to look for errors and such.
To use EXEC instead, you shoud do:
EXEC ["/bin/sh", "-c", "mysql -u user01 -p pwd01 ... < " &
Application.Path &/ "mytables.sql"] to sql_result
(As you see, it simply calls /bin/sh passing it a command to execute.
IE, this is the same as SHELL!)
You can avoid to call "/bin/sh" if you don't need /bin/sh functionalities.
Another, more controlled way, but more complicated, is to create the
pipes yourself, and do what the shell would do.
SHELL ... FOR INPUT OUTPUT ...
This way, you can feed the command whatever you want, not just a file
but live data you create on the fly, perhaps reading them from a file
you opened... but this is another matter.
Regards,
--
Doriano Blengino
"Listen twice before you speak.
This is why we have two ears, but only one mouth."
More information about the User
mailing list