Skip to content

AS400JPLPC/libpq-wrapper

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

53 Commits
 
 
 
 
 
 

Repository files navigation

libpq-wrapper

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

Releases

No releases published

Packages

No packages published