lundi 31 octobre 2011

Mélanger pqxx et wxWidgets

Une part non négligeable du boulot de développeur est de convertir des données d'un format vers un autre pour faire causer deux composants séparés.

Alors, pour une fois que c'est simple, l'on ne va pas bouder notre plaisir. C'est que le concepteur de libpqxx a eu la bonne idée de fournir des type traits pour passer ses propres types à la base de données pour les requêtes préparées.

Si l'on veut donc pouvoir sauver des chaînes de caractères wxWidgets (wxString) ou des dates (wxDateTime), il suffit d'implémenter le trait qui va bien. Cela ressemble à ça:


namespace pqxx
{
template<> struct PQXX_LIBEXPORT string_traits<wxString>
{
static const char * name() { return "wxString"; }
static bool has_null() { return false; }
static bool is_null(const wxString &) { return false; }
static wxString null()
{ internal::throw_null_conversion(name()); return wxString(); }
static void from_string(const char Str[], wxString & Obj)
{ Obj = wxString(Str, wxConvUTF8); }
static PGSTD::string to_string(const wxString & Obj)
{ return std::string(Obj.mb_str(wxConvUTF8)); }
};

template<> struct PQXX_LIBEXPORT string_traits<wxDateTime>
{
static const char * name() { return "wxDateTime"; }
static bool has_null() { return false; }
static bool is_null(const wxDateTime &)
{ return false; }
static wxDateTime null()
{ internal::throw_null_conversion(name()); return wxDateTime(); }
static void from_string(const char Str[], wxDateTime & Obj)
{ Obj.ParseDateTime(wxString(Str, wxConvUTF8)); }
static PGSTD::string to_string(const wxDateTime & Obj)
{ return std::string(Obj.Format().mb_str(wxConvUTF8)); }
};
}


L'on indique simplement comment convertir une PGSTD::string (qui est en fait une bête std::string) dans le type de travail, et basta, avec ça, les appels du type
T.prepared("statement")(wxString1)(wxString2)(wxDateTime1).exec();
passent comme une lettre à la poste.

Aucun commentaire: