wrapper de base en c++ une class
travail avec gcc-8 c++11... c++17
fait avec XUBUNTU / DEBIAN / MANJARO
il est basé sur libpq C API
ce projet à pour but de simplifier l'accès au travers de libpq mise à disposition par PostGreSql.
projet 2018-03-18 (C) 2018 Copyright 2018 laroche.jeanpierre@gmail.com
je voudrais remercier...
THANK YOU MERCI BEAUCOUP
le site quebecois https://h-deb.clg.qc.ca/ pour son travaille de divulgation
exemple: https://h-deb.clg.qc.ca/Sujets/Divers--cplusplus/templates_variadiques.html
https://stackoverflow.com une mine d'or pour comprendre avec des examples
https://docs.postgresql.fr/ pour tous les efforts pour la traduction
le site Français wikiversity https://fr.wikiversity.org/wiki/Langage_C%2B%2B
le site cppreference http://en.cppreference.com/w/
http://fr.cppreference.com/w/
le site cplusplus http://www.cplusplus.com/reference/
le site beaver https://dbeaver.com/ pour sa simplicité
le site pgadmin4 https://www.pgadmin.org/ pour tous ses efforts de migrations
et tout ceux qui part leur publication sur des sujets pointus mon permis d'avancé.
ce projet avec ZONED sont intimement lier et conjointement permettent d'approcher un langage de type 4G
Le sujet qui sera développer après la validation du wrapper
Le wrapper se base libpq de PostGreSql
une class libpqwrp.a library pq (libpq) wrp (wrapper)
ou une class libpqwrp.hpp
pour contenir les éléments qui permettent de rendre flexible l'ensemble du process.
pour avoir plusieurs connexions par exemple
une pour les lock update
une pour les read
cela permet de rendre les commits independants etc.....
de faire des pointeurs et de profiter de ses avantages pour le nettoyage de mémoire.
le contrôle du clear de PGresult
la possibilité de faire du istream ou ostream
la récupération du nom avec traitement switch
un type template de variadique pour les requêtes
un autre type stringstream pour les résultats de requête
possibilté d'avoir plusieurs cursor
de traiter les double et int
traitement lock enregistrement select for update avec serialisation
traitement des erreurs...
je souhaite avoir été clair.
il y a plusieurs approches et de façon de traiter les données
il est certainement possible d'aller beaucoup plus loin,
soit dans les traitements d'erreurs .....sachez que sous pgsql ECPG on peut aller beaucoup plus loin
ou insérer des particularitées en relation avec le metier....
mais d'après moi cela serait autre chose qu'un wrapper
ps j'ai laissé en commentaire une ligne pour connaitre les codes retour d'intérroguation ....
N'oubliez pas d'ouvrir un role pour la lecture seulement (read only) par exemple :
CREATE ROLE Read_Only_User WITH LOGIN PASSWORD 'read'
NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION VALID UNTIL 'infinity';
GRANT CONNECT ON DATABASE "CGIFCH" TO Read_Only_User;
GRANT USAGE ON SCHEMA public TO Read_Only_User;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO Read_Only_User;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO Read_Only_User;
Utiliser la Lib libpqwrp.a ex: Tiostream ou #include <libpqwrp.hpp> ex:Tclasse (Encours d'élaboration)
slc.begin();
requete = slc.prepare( \
"SELECT " \
"cl.column_name,cl.ORDINAL_POSITION,cl.DATA_TYPE,cl.CHARACTER_MAXIMUM_LENGTH,cl.NUMERIC_PRECISION,cl.NUMERIC_SCALE " \
",(select pg_catalog.col_description(oid,cl.ordinal_position::int) from pg_catalog.pg_class c where c.relname=cl.table_name) as column_comment " \
"FROM information_schema.columns cl " \
"WHERE cl.table_catalog='?' and cl.table_name='?' " \
" order by 2 ; " ,(char*) gtk_entry_get_text(eDATABASE) ,(char*) gtk_label_get_text(eTABLE) );
slc.begin();
slc.opensql(requete, cursorName);
if ( !slc.errorSQL ) do
{
if ( ! slc.fetchEOF )
{
sqlx = slc.result();
sqlx>>column_name>>column_ordre>>column_type>>column_length>>column_precision>>column_scale>>column_comment;
std::cout<<column_name<<" "<<column_ordre<<" "<<column_type<<" :"<<column_length<<": "<<column_precision<<","<<column_scale<<" >>>> "<<column_comment<<std::endl;
slc.fetchsql(cursorName);
}
}while ( !slc.fetchEOF ) ;
slc.end();
or
slc.begin();
slc.fetchAll(requete, cursorName);
printMsg("Generator_Field");
for (int row = 0; row < slc.countrow() && slc.fetchEOF ==false ; row++)
{
for (int nf = 0;nf < slc.countfield(); nf++)
{
switch (HashStringToInt(slc.cfield(nf)))
{
case HashStringToInt(NAMEOF(column_name)): column_name = slc.fetch( row, nf); break; //exemple avec le Nom de la Variable
case HashStringToInt("ordinal_position"): column_ordre = slc.fetchInt( row, nf); break;
case HashStringToInt("data_type"): column_type = slc.fetch( row, nf); break;
case HashStringToInt("character_maximum_length"): column_length = slc.fetchInt( row, nf); break;
case HashStringToInt("numeric_precision"): column_precision = slc.fetchInt( row, nf); break;
case HashStringToInt("numeric_scale"): column_scale = slc.fetchInt( row, nf); break;
case HashStringToInt(NAMEOF(column_comment)): column_comment = slc.fetch( row, nf); break;
}
}
std::cout<<column_name<<" "<<column_ordre<<" "<<column_type<<" :"<<column_length<<": "<<column_precision<<","<<column_scale<<" >>>> "<<column_comment<<std::endl;
}
un exemple de génération de source pour des requêtes