1 pièce(s) jointe(s)
Utilisation des fonctions inline et données non utf avec python
Bonjour,
je suis en train de créer une base de données avec pysqlite sous linux et j'ai le problème suivant.
Ma BDD peut contenir, selon les cas, des informations en clair ou cryptées.
Je voudrais pouvoir de façon transparente, déclarer cette base avec un champs titre, description, etc... et lire ces données via une fonction decrypt(titre), decrypt(title), ... qui aura été déclarée, selon le cas comme decrypt(s) = s dans le cas d'une base de données non cryptée ou decrypt(s) = cipher.decrypt(s) dans le cas d'une BDD cryptée.
Pour pouvoir lire dans tous les cas des données même cryptées (donc pas en utf-8), je fais à l'ouverture de ma base un
Code:
mabase.text_factory=str
de cette façon, il m'est possible par exemple de récupérer mes données sous la forme
Code:
1 2 3 4 5 6 7
| # ce code marche
mabase.text_factory=str
cur = mabase.execute('SELECT title from documents')
L=cur.fetchone()
L=L[0]
title=cipher.decrypt(L)
print title |
mais impossible d'utiliser directement la fonction decrypt en la déclarant comme fonction dans pysqlite (via un mabase.create_function) la fonction de decrypt reçoit un None à la place de la chaine à décrypter (sans doute pysqlite a-t-il essayé de le lire en utf sans succès avant de le transmettre a ma fonction).
Code:
1 2 3 4 5 6 7 8
| # ce code ne marche pas
mabase.text_factory=str
mabase.create_function('decrypt',1,lamda s : decrypt(s,cipher))
cur = mabase.execute('SELECT decrypt(title) from documents')
L=cur.fetchone()
L=L[0]
title=L
print title |
Je suppose que le texte_factory s'applique APRES l'appel à ma fonction.
Bien sur, la procédure fonctionne si le texte n'est pas crypté et qu'il est décodable en utf.
Ci-joint un petit script qui reproduit le problème
Quelqu'un aurait-il une idée pour contourner ce problème ?