Literal Escaped Octets

2006-02-05 Thread Chason Hayes
I am trying to convert raw binary data to data with escaped octets in
order to store it in a bytea field on postgresql server. I could do this
easily in c/c++ but I need to do it in python. I am not sure how to read
and evaluate the binary value of a byte in a long string when it is a non
printable ascii value in python. I read some ways to use unpack from the
struct module, but i really couldn't understand where that would help. I
looked at the MIMIEncode module but I don't know how to convert the object
to a string. Is there a module that will convert the data? It seems to me
that this question must have been answered a million times before but I
can't find anything.



See http://www.postgresql.org/docs/8.1/interactive/datatype-binary.html
for a description of the problem domain.


-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Literal Escaped Octets

2006-02-06 Thread Chason Hayes
On Mon, 06 Feb 2006 13:39:17 +, Steve Holden wrote:

> Chason Hayes wrote:
>> I am trying to convert raw binary data to data with escaped octets in
>> order to store it in a bytea field on postgresql server. I could do this
>> easily in c/c++ but I need to do it in python. I am not sure how to read
>> and evaluate the binary value of a byte in a long string when it is a non
>> printable ascii value in python. I read some ways to use unpack from the
>> struct module, but i really couldn't understand where that would help. I
>> looked at the MIMIEncode module but I don't know how to convert the object
>> to a string. Is there a module that will convert the data? It seems to me
>> that this question must have been answered a million times before but I
>> can't find anything.
>> 
>> 
>> 
>> See http://www.postgresql.org/docs/8.1/interactive/datatype-binary.html
>> for a description of the problem domain.
>> 
>> 
> The URL you reference is discussing how you represent arbitrary values 
> in string literals. If you already have the data in a Python string the 
> best advise is to use a parameterized query - that way your Python DB 
> API module will do the escaping for you!
> 
> regards
>   Steve

Thanks for the input. I tried that with a format string and a
dictionary, but I still received a database error indicating illegal
string values. This error went away completely when I used a test file
consisting only of text, but reproduced everytime with a true binary file.
If you can let me know where I am wrong or show me a code snippet with a
sql insert that contains a variable with raw binary data that works,
I would greatly appreciate it.

Chason

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Literal Escaped Octets

2006-02-06 Thread Chason Hayes
On Sun, 05 Feb 2006 21:07:23 -0800, Alex Martelli wrote:

> Chason Hayes <[EMAIL PROTECTED]> wrote:
>...
>> easily in c/c++ but I need to do it in python. I am not sure how to read
>> and evaluate the binary value of a byte in a long string when it is a non
>> printable ascii value in python.
> 
> If you have a bytestring (AKA plain string) s, the binary value of its
> k-th byte is ord(s[k]).
> 
> 
> Alex

Thank you very much, That is the function that I was looking for to write
a filter.

Chason

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Literal Escaped Octets

2006-02-07 Thread Chason Hayes
On Tue, 07 Feb 2006 15:06:49 +, Bengt Richter wrote:

> On Mon, 06 Feb 2006 04:40:31 GMT, Chason Hayes <[EMAIL PROTECTED]> wrote:
> 
>>I am trying to convert raw binary data to data with escaped octets in
>>order to store it in a bytea field on postgresql server. I could do this
>>easily in c/c++ but I need to do it in python. I am not sure how to read
>>and evaluate the binary value of a byte in a long string when it is a non
>>printable ascii value in python. I read some ways to use unpack from the
>>struct module, but i really couldn't understand where that would help. I
>>looked at the MIMIEncode module but I don't know how to convert the object
>>to a string. Is there a module that will convert the data? It seems to me
>>that this question must have been answered a million times before but I
>>can't find anything.
>>
> Have you considered just encoding the data as text in hex or base64, e.g.,
> 
>  >>> import binascii
>  >>> s = '\x00\x01\x02\x03ABCD0123'
>  >>> binascii.hexlify(s)
>  '000102034142434430313233'
>  >>> binascii.b2a_base64(s)
>  'AAECA0FCQ0QwMTIz\n'
> 
> which is also reversible later of course:
>  >>> h = binascii.hexlify(s)
>  >>> binascii.unhexlify(h)
>  '\x00\x01\x02\x03ABCD0123'
>  >>> b64 = binascii.b2a_base64(s)
>  >>> binascii.a2b_base64(b64)
>  '\x00\x01\x02\x03ABCD0123'
> 
> Regards,
> Bengt Richter

I had just about come to that conclusion last night while I was working on
it. I was going to use
import base64
base64.stringencode(binarydata)
and
base64.stringdecode(stringdata)

I then wasn't sure if I should still use the bytea field or just use a
text field.

Do you have a suggestion?

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Literal Escaped Octets

2006-02-07 Thread Chason Hayes
On Tue, 07 Feb 2006 01:58:00 +, Steve Holden wrote:

> Chason Hayes wrote:
>> On Mon, 06 Feb 2006 13:39:17 +, Steve Holden wrote:
> [...]
>>>
>>>The URL you reference is discussing how you represent arbitrary values 
>>>in string literals. If you already have the data in a Python string the 
>>>best advise is to use a parameterized query - that way your Python DB 
>>>API module will do the escaping for you!
>>>
>>>regards
>>>  Steve
>> 
>> 
>> Thanks for the input. I tried that with a format string and a
>> dictionary, but I still received a database error indicating illegal
>> string values. This error went away completely when I used a test file
>> consisting only of text, but reproduced everytime with a true binary file.
>> If you can let me know where I am wrong or show me a code snippet with a
>> sql insert that contains a variable with raw binary data that works,
>> I would greatly appreciate it.
>> 
> I tried and my experience was exactly the same, which made me think less 
> of PostgreSQL.
> 
> They don't seem to implement the SQL BLOB type properly, so it looks as 
> though that rebarbative syntax with all the backslashes is necessary. Sorry.
> 
> regards
>   Steve

with regards to escaping data parameters I have found that I have to
specifically add quotes to my strings for them to be understood by
pstgresql. For example

ifs=open("binarydatafile","r")
binarydata=ifs.read()
stringdata=base64.encodestring(binarydata)

#does not work
cursor.execute("insert into binarytable values(%s)" % stringdata)

#need to do this first
newstringdata = "'" + stringdata + "'"

then the select statment works.
Is this expected behavior? Is there a better way of doing this?

thanks for any insight
Chason


-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Literal Escaped Octets

2006-02-08 Thread Chason Hayes
On Wed, 08 Feb 2006 00:57:45 -0500, Steve Holden wrote:

> Chason Hayes wrote:
>> On Tue, 07 Feb 2006 01:58:00 +, Steve Holden wrote:
>> 
>> 
>>>Chason Hayes wrote:
>>>
>>>>On Mon, 06 Feb 2006 13:39:17 +, Steve Holden wrote:
>>>
>>>[...]
>>>
>>>>>The URL you reference is discussing how you represent arbitrary values 
>>>>>in string literals. If you already have the data in a Python string the 
>>>>>best advise is to use a parameterized query - that way your Python DB 
>>>>>API module will do the escaping for you!
>>>>>
>>>>>regards
>>>>> Steve
>>>>
>>>>
>>>>Thanks for the input. I tried that with a format string and a
>>>>dictionary, but I still received a database error indicating illegal
>>>>string values. This error went away completely when I used a test file
>>>>consisting only of text, but reproduced everytime with a true binary file.
>>>>If you can let me know where I am wrong or show me a code snippet with a
>>>>sql insert that contains a variable with raw binary data that works,
>>>>I would greatly appreciate it.
>>>>
>>>
>>>I tried and my experience was exactly the same, which made me think less 
>>>of PostgreSQL.
>>>
>>>They don't seem to implement the SQL BLOB type properly, so it looks as 
>>>though that rebarbative syntax with all the backslashes is necessary. Sorry.
>>>
>>>regards
>>>  Steve
>> 
>> 
>> with regards to escaping data parameters I have found that I have to
>> specifically add quotes to my strings for them to be understood by
>> pstgresql. For example
>> 
>> ifs=open("binarydatafile","r")
>> binarydata=ifs.read()
>> stringdata=base64.encodestring(binarydata)
>> 
>> #does not work
>> cursor.execute("insert into binarytable values(%s)" % stringdata)
>> 
>> #need to do this first
>> newstringdata = "'" + stringdata + "'"
>> 
>> then the select statment works.
>> Is this expected behavior? Is there a better way of doing this?
>> 
>> thanks for any insight
> 
> Yes, parameterize your queries. I assume you are using psycopg or 
> something similar to create the database connection (i.e. I something 
> that expects the "%s" parameter style - there are other options, but we 
> needn't discuss them here).
> 
> The magic incantation you seek is:
> 
> cursor.execute("insert into binarytable values(%s)", (stringdata, ))
> 
> Note that here there are TWO arguments to the .execute() method. The 
> first is a parameterized SQL statement, and the second is a tuple of 
> data items, one for each parameter mark in the SQL.
> 
> Using this technique all necessary quoting (and even data conversion 
> with a good database module) is performed inside the database driver, 
> meaning  (among other things) that your program is no longer vulnerable 
> to the dreaded SQL injection errors.
> 
> This is the technique I was hoping would work with the bytea datatype, 
> but alas it doesn't. ISTM that PostgreSQL needs a bit of work there, 
> even though it is otherwise a very polished product.
> 
> regards
>   Steve

That was it. Thanks for your great help.

Chason

-- 
http://mail.python.org/mailman/listinfo/python-list


how to make script interact with another script

2006-03-20 Thread Chason Hayes
How can I get a script to pipe data to another program, wait for a
response, then send more data etc.

For example, from a script, I want to run smbclient then send it the
username, password, and then some commands. (I know there are better ways
to achieve this functionality, it is the principle that I am after)

-- 
http://mail.python.org/mailman/listinfo/python-list