Sunteți pe pagina 1din 17

APLICATII CGI/MYSQL IN C++

TEMA SI MOTIVATIA ALEGERII

Intr-o fraza, maxim doua, se va define tema proiectului, iar in continuare, pe o jumatate de pagina, se poate face si o prezentare o motivarii ce a condus la alegerea temei corespunzatoare.

FORMULAREA TEMEI Realizarea unei aplicatii web ce va utiliza tehnologia CGI si va implementa problema gestiunii admiterii studentilor in invatamantul superior.

MOTIVAREA ALEGERII TEMEI Acesta problem poate fi rezolvata in dou moduri, functie de modul in care manipulam datele, utilzand fisiere text/binare sau utilizand conectori C++ pentru acces la MySQL. Incercand sa realizez aplicatii web am simtin nevoia de trece de la stilul static al paginilor web in format html la un stil dinamic. O prima solutie identificata ar fi implementarea paginilor html folosind limbajul php, dar putem aborda aceeasi problem utilizand tehnologia CGI. A dou varianta o consider mai potrivita, pentru acest moment al pregatirii mele de student, din cel putin dou motive: 1. Imi permite sa aprofundez in continuare limbajul C++; 2. Imi ofera o libertate in abordarea formularelor, in sensul ca pot utiliza mai multe resusrse ale sistemului de operare decat pot utiliza cu limbajul php; Evident, ca exist si dezavantaje, cum ar fi complexitatea codului, dar acest dezavantaj va fi compensat cu avantajele enumerate mai sus.

PROBLEMATICA ADMITERII
Acest capitol/subcapitol se ocupa cu problematic admiterii in cadrul invatamantului superior. In acest scop studentul va incerca sa schiteze cateva notiuni: Datele furnizate comisiei de admitere; Rapoartele de care ati beneficiat pe parcursul admiterii; Rezultatele finale, clasificarea pe specializari.

Dupa aceast trecere in revista se va incerca o abordate teoretica a problemei admiterii in sensul structurarii datelor deja definite la etapa anterioara.
DATELE FURNIZATE COMISIEI DE ADMITERE

In principiu vorbim despre date personale, obligatorii si optionale, functie de specificul admiterii (licenta, masterat, doctorat, eventual continuare studii), respective disponibilitatea candidatului (adresa email, telefon). Deoarece problem este una nu foarte simpla, dac este abordata in intreaga ei complexitate, vom merge pe o varianata mult simplificata, astfel: Datele personale vor cele minimale (nume, CNP, date contact); Date despre studiile anterioare minimale (Liceu/facultate, serie act, rezultate obtinute); In cazul probelor de examen se considera ca avem un format standard ca nr. de probe, de exemplu 2, cu ponderi egale, 50% - 50%; Ignoram problem taxelor sau o putem lua in considerare (taxa de inscriere si cea de inmatriculare); Dac le luam in considerare atunci vom fi nevoiti sa luam in calcul si problem scutirilor de taxa; Si uite asa problema se tot complica;

Pentru a asigura un anumit grad de configurabilitate putem adopta si stilul ca anumite informatii sa fie deja oferite prin asa numitele fisiere de configurare, de exemplu XML. Astfel, intr-un astfel de fisier putem furniza: numele Facultatii si al Universitatii; numarul si numele probelor, precum si ponderile pentru fiecare proba;

etc

Observatie Asupra acestui capitol vom reveni pe parcursul analizei problemei

RAPOARTE PE PARCURSUL ADMITERII

Rapoartele minime necesare pe parcursul admiterii pot fi clasificat in rapoarte publice si rapoarte interne, dar le putem trata pe toate unitary, astfel: formularul de introducere a datelor la inscriere; formularul utilizat la inmatriculare/retragere; fisa de inscriere, raport ce va oferi spre imprimare un raport HTML dup un sablon anume toate datele ce au fost introduce, impreuna cu rezultatele obtinute sip e care candidatul si le asuma; lista cu inscrisii si inmatriculatii zilnic; lista cu inmatriculatii pe bazine de recrutare; etc

Pentru fiecare din acest raport si formular se va face o descriere si o analiza specifica, pe tema datelor ce vor fi introduce si analizand coerenta acestora. De exemplu, cum rezolvam problema liceelor ce isi schimba denumirea, dar noi trebuind sa vorbim despre aceeasi entitate. O problem asemnatoare intalnim atat la Judete/orase/localitati cat si la denumirile de strazi. Acesta problem este una foarte importanta in domeniul aplicativ al bazelor de date. O solutie simpla ar fi sa dam libertate in introducerea numelor de orase/localitati si strazi, dar evident, ca aceasta nu este solutia ideala, dar este o rezolvare punctuala.

REZULTATELE FINALE, CLASIFICAREA PE SPECIALIZARI

In acest caz vorbim de un singur formular, listing, in care afisam candidatii, in ordinea descrescatoare a mediei de admitere, in care vom puncta (sublinia) dou puncte importante: ultima medie de admitere la buget; ultima medie de admitere la taxa; capacitatea de scolarizare, stabilita prin vizetele ARACIS1.

ARACIS - http://www.aracis.ro/

Tinand seama de specificul admiterii in USV/FIESC, din acest an, aceste liste pot evolua zilnic, functie de inmatricularile si retragerile curente. Observatie Asupra acestui capitol vom reveni pe parcursul analizei problemei

STRUCTURAREA/ORGANIZAREA DATELOR

Se va defini la nivel logic datele cu care se intra in Admitere. Aceste date vor fi furnizate atat de candidat ( date personale, studii ) cat si de procesul de Admitere ( rezultate examene/teste ).

Organizarea datelor personale Aici vom defini, din punct de vedere logic, datele personale, impreuna cu tipul si dimensiunea lor, a candidatului ce se prezinta la Admitere. Tabelele ce vor fi descries mai jos pot fi implementate, simplu, utilizand fisiere sau putem realiza o conexiune la MySQL si astfel avem o solutie ce va conduce catre o abordare profesionala.

tbl_date_pers_candidat Denumire camp Id_candidat Nume candidat Nume tata Nume mama CNP Data nastere Telefon Email Comentarii Tip Intreg Caracter Caracter Caracter Caracter Caracter Caracter Caracter Caracter Dimensiune 1 30 30 30 15 12 - yyyy-mmdd 30 30 50 Descriere Identificator unic

Diverse notatii

Dupa cum se observa in tabela anterioara intervine notiune de identificator unic (Id_candidat). Acest identificator va fi folosit pentru a realiza o conexiune logica cu alte tabele din baza de date. Constrangerea de unicitate va fi asigurata prin diferit implementrii: generare aleatoare si verificarea existentei identificatorului

utilizarea unui tabel/fisier special in care avem toti identificatorii unici din baza de date, iar la adaugarea unei noi inregistrari, identificatorul va fi generat, prin incrementare, pe baza acestui tabel.

Organizarea studiilor anterioare Aici vom defini, din punct de vedere logic, studiile anterioare urmate sau absolvite de candidat, impreuna cu tipul si dimensiunea lor, a candidatului ce se prezinta la Admitere. tbl_studii_ant_candidat Denumire camp Id_studii_ant Id_candidat Tip_studii Denumire_unitate Data_absolvire Titlu_obtinut Serie_act_studiu Comentarii Tip Intreg Intreg Caracter Caracter Caracter Caracter Caracter Caracter Dimensiune 1 1 15 30 12 - yyyy-mmdd 30 15 50 Descriere Identificator unic Foreign key

Diverse notatii

Organizarea rezultatelor obtinute Un candidat poate participa, la admitere, la mai multe specializari cu aceleasi date personale, deja introduce, motiv pentru care trebuie sa obtinem o conexiune logica intre candidatul virtual (atasat unei specializari0 si canditul fizic (ce a furnizat un set de date personale). Pe parcursul admiterii se face diferenta intre candidatul fizic si cel conventional (virtual). Observatie Asupra acestui capitol vom reveni pe parcursul analizei problemei

Se va incerca definirea unei organigrame la nivel de tabele logice. Observatie Asupra acestui capitol vom reveni pe parcursul analizei problemei

Observatie

Asupra acestui capitol vom reveni pe parcursul analizei problemei

PROGRAMARE WEB. LIMBAJUL HTML


Acest capitol/subcapitol se ocupa cu partea teoretica si practic a tehnologiilor folosite in cadrul proiectului. Studentul va ignora, momentan, partea de limbaj C++ si va aborda celelalte tehnologii: programare web cu HTML si CGI. La partea de CGI se va studia problema implementrii lor in C respectiv in limbajul script (bash script), eventual.

1.1 PAGINA WEB. TAG-URI HTML


Constructia unei pagini web consta in editarea unui document folosind TAG-uri HTML2, TAG-uri ce ne permit formatarii informatiei ce urmeaza a aparea pe pagina respectiva, astfel: - marcarea unei zone va incepe cu un TAG, de exemplu <html>, iar sfarsitul zonei, este marcat prin TAG-ul complementar, </html>; - documentul dispune de doua zone distincte, neobligatorii, astfel: o sectiunea de header <head> ... </head>, defineste informatii despre document o <title> ... </title>, defineste titlul paginii <!DOCTYPE>, tipul documentului etc

sectiunea <body> ... </body>, rezervata corpului documentului

- zona marcata prin <p> ... </p>, defineste o zona paragraf; - etc In sectiunea de mai jos avem un exemplu de pagina web, creata cu un editor de texte, pagina care in urma publicarii pe web produce efectul din figura urmatoare.
<html> <head> </head> <body> <h1>PRIMA PAGINA</h1> <p>Primul paragraf...<br> Acesta este un exemplu<br>de paragraf</p>

<title>TITLUL PAGINII</title>

</body> </html>
2

http://www.w3schools.com/html/default.asp

In urma copierii fisierului creat, pe server, in directorul ~/public_html/cgi, sub numele first.html, obtinem efectul de mai jos:

Evident, a fost setat cel putin dreptul de read, pentru others, pe fisierul first.html.

1.2 PRIMA PAGINA WEB. DREPTURI SI PUBLICARE


Dupa crearea unei pagini html, similar paginii anterioare, va trebui sa realizam urmatoarele operatii: salvam pagina cu extensia html, de exemplu: first.html; stabilim drepturile necesare publicarii sale pe web, acestea fiind: minim drept de read pentru others; copierea paginii in directorul public_html sau intr-un alt subdirector al acestuia.

Pentru directorul public_html (eventual subdirectoarele acestuia), se recomanda a avea dreptul execute pentru others, eventual si read, doar ca in acest caz se poate vedea intreg continutul directorului.

Modificare drepturilor pentru un fisier sau director, in Linux, se realizeaza prin intermediul comenzii chmod, astfel.

Acesarea paginii se face prin intermediul urcarui brouser de Internet, introducand adresa paginii, astfel: in cazul in care aveti pagina pe serverul Apollo ( apollo.eed.usv.ro ), iar contul dumneavostra ar fi popescu_ar, continutul fisierului index.html, din directorul Public_html va fi vizualizat daca tastam urmatoarea adresa: o o http://apollo.eed.usv.ro/~popescu_ar sau http://apollo.eed.usv.ro/~popescu_ar/index.html

In cazul in care pagina cu numele first.html se afla in subdirectorul cgi, accesarea se face astfel: http://apollo.eed.usv.ro/~popescu_ar/cgi/first.html.

Observatie Dupa salvarea documentului, copierea si setarea drepturilor s-a realizat prin intermediul scriptului copie.sh, descris mai jos in cadrul materialului.

TEHNOLOGIA CGI
Dupa realizarea primei pagini Web, constatam faptul ca informatia stocata de aceasta este statica si simtim nevoia de dialog cu vizitarul. In principiu, am dori sa permitem vizitatorului sa trimita un mail sau sa introducem un contor care sa inregistreze numarul de vizitatori ai paginii Web. Pentru toate acesta, scripturile CGI reprezinta solutia optima, ele pot realiza chiar lucruri mult mai complicate.

1.3 INTRODUCERE
C GI - C OM M O N G AT E W A Y I NT E RF A C E

Este metoda prin care un server web poate sa prezinte informatia vizitatorilor prin intermediul unui browser web, in functie de cererile acestora, interactiv, accesand baze de date sau documente, si extragand informatia ceruta. Scripturile CGI sunt executate n timp real, astfel nct poate afisa informatii dinamice. De exemplu, cu ajutorul unui aplicatii CGI browserul web poate afisa n format HTML continutul unei baze de date UNIX aflata pe server. n principiu trebuie creat un program care sa extraga informatia din baza de date, sa le prelucreze si sa returneze browserului web informatia dorita n format HTML, pentru vizualizare. Principial, aplicatiile CGI sunt n formate din doua parti distincte: un formular HTML cu ajutorul caruia se transmit programului CGI criteriile de cerere dupa care se va interoga baza de date si un program CGI care proceseaza cererile furnizate de formular, intoregheaza baza de date, extrage informatia si prezinta rezultatele prin intermediul browserului web sub forma unor documente HTML, completat cu imagini si clipuri audio.

1.4 TEHNOLOGIA CGI. PRINCIPII


CGI ofera o soluie simpl la problema paginilor web dinamice. Protocolul CGI definete o metod standard pentru ca programele s interacioneze cu serverul. Fr cunotine de specialitate, se pot scrie programe n orice limbaj de programare dorit (C, C++, shell, etc ) care comunic cu serverul web, programul lucrand pe orice server care nelege protocolul CGI. Comunicaia n CGI este rezolvat prin intrarea i ieirea standard, ceea ce nseamn c daca citim/scriem date ( de la/la consola standard), n limbajul de

programare preferat, se poate scrie o aplicaie web. n afara interpretrii intrarilor i ieirilor programarea aplicaiilor CGI este echivalent cu scrierea oricrei alte aplicatii. De exemplu, daca vrei s facei un program care afieaz "Hello world!" vei utiliza funciile de tiparire din limbajul preferat i formatul definit pentru programele CGI pentru a afia mesajul potrivit. Deoarece CGI este o interfa comun nu este restricionat utilizarea unui anumit limbaj. Pentru a fi siguri c limbajul este potrivit pentru CGI el trebuie s poat face urmtoarele: - Tiprire la ieirea standard - Citire de la intrarea standard - Citire din variabilele de mediu Aproape toate limbajele de programare i multe din limbajele de scripting pot face aceasta aa c putei utiliza oricare din ele. Un limbaj compilat cum ar fi C sau C++ tinde s fie mai mic i mai rapid, pe cnd limbajele interpretate cum ar fi perl sau python trebuie s ncarce un interpretor, care poate fi destul de mare, la nceput. Un alt avantal al limbajelor compilate este ca in cazul acestora se pot distribui executabile fr codul surs.

1.5 TEHNOLOGIA CGI. PRACTIC

1.6 FORMULARE

1.7 FORMULARE SI CGI IN C++

INSTRUMENTE PENTRU DEZVOLTARE

1.8 SCRIPT PENTRU AUTOMATIZAREA COPIERILOR


Crearea unui script pentru copierea executabileleor CGI/paginilor web in directoarele corespunzatoare, impreuna cu stabilirea drepturilor corespunzatoare. Continutul fisierului script (copie.sh) este prezentat in continuare, impreuna cu secventa de editare si de stabilire a dreptului de executie. Acest scrip poate fi creat in orice director de lucru si va copia fisierele specificate in cele doua directoare ( public_html/cgi si public_html/cgi-bin ). $ vi copie.sh #!/bin/sh ## $1 = tipul fisierului ( "cgi" / "html" ) ## $2 = fisierul care se copie _CGI=~/public_html/cgi-bin _HTML=~/public_html/cgi if [ $1 = cgi ]; then echo "[ `whoami` ] - copie (./$2) in $_CGI/$2" chmod 751 ./$2 rm $_CGI/$2 cp ./$2 $_CGI/$2 ls -al $_CGI/$2 elif [ $1 = html ]; then echo "[ `whoami` ] - copie (./$2) in $_HTML/$2" chmod 754 $2 rm $_HTML/$2 cp ./$2 $_HTML/$2 ls -al $_HTML/$2 else echo "[ `whoami` ] - eroare parametru ($1) !" fi $ chmod 700 copie.sh

1.8.1 COPIEREA UNUI FISIER HTML


Copierea unui fisier avand numele first.html, se face tastand comanda ./copie.sh html first.html, astfel:

Daca dorim ca directorul final sa fie altul, decat ~/public_html/cgi/, putem edita fisierul scrip in acest scop, modificand valoarea constantei _HTML.

1.8.2 COPIEREA UNUI FISIER CGI


Copierea unui fisier avand numele frmwk, se face tastand comanda ./copie.sh cgi frmwk.cgi, astfel:

Daca dorim ca directorul final sa fie altul, decat ~/public_html/cgi-bin/, putem edita fisierul scrip in acest scop, modificand valoarea constantei _CGI.

CONECTAREA LA MYSQL

1.9 INSTALAREA LIBRARIEI MYSQLCONNECTOR-C++

1.10 CONECTAREA LA SERVERUL MYSQL

1.11 EXECUTIA UNUI QUERY

1.12 ITERAREA REZULTATULUI UNUI QUERY

TEHNOLOGIA CGI. PROBLEMA REZOLVATA

1.13 TEMA PROPUSA

1.14 ABORDAREA PROBLEMEI

1.15 SOLUTIE

1.15.1
#include #include #include #include <stdlib.h> <iostream> <sstream> <stdexcept>

MODULUL CGI

#include "mysql_connection.h" #include #include #include #include #include #define #define #define #define <cppconn/driver.h> <cppconn/exception.h> <cppconn/resultset.h> <cppconn/statement.h> <cppconn/prepared_statement.h> EXAMPLE_HOST "localhost" EXAMPLE_USER "root" EXAMPLE_PASS "" EXAMPLE_DB "world"

using namespace std; int main(int argc, const char **argv) { string url(argc >= 2 ? argv[1] : EXAMPLE_HOST); const string user(argc >= 3 ? argv[2] : EXAMPLE_USER); const string pass(argc >= 4 ? argv[3] : EXAMPLE_PASS); const string database(argc >= 5 ? argv[4] : EXAMPLE_DB);

cout << "Connector/C++ tutorial framework..." << endl; cout << endl; try { /* INSERT TUTORIAL CODE HERE! */ } catch (sql::SQLException &e) { /* The MySQL Connector/C++ throws three different exceptions: - sql::MethodNotImplementedException (derived from sql::SQLException) - sql::InvalidArgumentException (derived from sql::SQLException) - sql::SQLException (derived from std::runtime_error) */ cout << "# ERR: SQLException in " << __FILE__; cout << "("<<__FUNCTION__<< ") on line " <<__LINE__<< endl; /* Use what() (derived from std::runtime_error) to fetch the error message */ cout << "# ERR: " << e.what(); cout << " (MySQL error code: " << e.getErrorCode(); cout << ", SQLState: " << e.getSQLState() << " )" << endl; } return EXIT_FAILURE;

cout << "Done." << endl; return EXIT_SUCCESS;

ANEXE

1.16 CONNECTOR C++ PENTRU MYSQL


Instalarea se face de catre root, utilizand instructiunile urmatoare: http://dev.mysql.com/doc/refman/5.1/en/connector-cpp-installation-sourceunix.html Documentatia mySQL pentru connectorul C++: http://dev.mysql.com/doc/refman/5.1/en/connector-cpp.html http://forge.mysql.com/wiki/Connector_C%2B%2B g++ -o frmwk -I/usr/local/include/cppconn/ -L/usr/local/lib/ -g -Wall frmwk.cpp -lmysqlcppconn-static -ldl

BIBLIOGRAFIE
ADMITERE USV: http://www.admitere.usv.ro/ http://www.usv.ro/fisiere_utilizator/REGULAMENT_Admitere_2012-2013.pdf FIESC: http://eed.usv.ro/html/admitere.html http://eed.usv.ro/eed_files/admitere/2012/Metodologie_admitere_2012_revizuit _10aprilie2012_licenta.pdf CGI - HTML 1. http://www.gnu.org/software/cgicc/doc/index.html 2. http://www.achacha.org/freeCGI/ 3. http://library.thinkquest.org/16728/content/cgi/cplusplus.html 4. http://www.yolinux.com/TUTORIALS/LinuxTutorialC++CGI.html 5. http://forge.mysql.com/wiki/Connector_C%2B%2B

6. yum install mysql-connector-c++ 7. http://www.w3schools.com/html/html_forms.asp 8. http://www.roadiro.ro/site/navigate/divprog/cgigen.html 9. http://www.itim-cj.ro/~jalobean/Cursuri/Linux-ro/cgi.pdf 10.http://www.c-cultural.ro/biblioteca%20virtuala/informatica/formulare.pdf 11.http://dev.mysql.com/doc/refman/5.1/en/connector-cpp-tutorials.html 12.http://softexpert.wordpress.com/2007/10/18/how-to-connect-to-a-mysql-dbusing-c-linux/