database's Introduction
Lăbău Cristea Andrei Liviu 314CB Implementarea unei console interactive care sa permita interactiunea utilizatorului cu baza de date a fost facuta cu ajutorul a 2 stringuri citite de la tastatura: comanda si comanda2. Intrucat se garanteaza ca prima comanda data de utilizator este INIT_DB si numele bazei de date, prima data se verifica daca a fost introdusa corect si se citeste de la tastatura numele. Apoi pentru a determina care sunt urmatoarele comenzi se intra intr-o bucla while in care se foloseste o succesiune de instructiuni if. Singura comanda prin care se iese din bucla while, are rolul de a sterge baza de date si se opreste executia programului este DELETE_DB. Dupa introducerea comenzii INIT_DB si citirea numelui bazei de date se apeleaza functia INIT_DB care aloca memorie pentru un element de tip t_db si initializeaza numele cu numele introdus de la tastatura. Pentru a insera un nou tabel in baza de date se apeleaza comanda CREATE urmata de numele noului tabel, tipul de date pe care urmeaza sa-l contina noul tabel si numele coloanelor. Functiile folosite pentru simularea acestei comenzi sunt: CREATE, ce primeste ca parametrii adresa bazei de date in care urmeaza sa se faca inserarea, un string ce reprezinta numele noului tabel si un string ce reprezinta tipul de date pe care tabelul urmeaza sa-l contina. Functia CREATE apeleaza la randul sau functia AlocTable care se foloseste la randul sau de o functie ce face conversia tipului de date dintr-un string in elementul corespunzator din enumul t_cellType si functia ReadColumns prin intermediul careia se aloca spatiu pentru o lista simplu inlantuita de celule de tip coloana, al carei cap de lista va fi reprezentat de pointerul columns din structura tabelului. De asemenea, functia ReadColumns citeste de la stdin pana la new line un string care este delimitat ulterior in mai multe substringuri la intalnirea caracterului ' ' sau '\n'. Aceste substringuri reprezinta numele coloanelor. Pe masura ce se gaseste un substring se apeleaza functia AlocColumn ce primeste ca parametru substringul. Se aloca celula corespunzatoare dupa care se realizeaza legaturile in lista: legare direct la pointerul columns din structura tabelului in cazul in care aceasta este prima celula din lista sau inserare la sfarsitul listei in caz contrar. Functia CREATE este apelata in functia main. Pentru a sterge un tabel din baza de date se foloseste comanda DELETE urmata de numele tabelului ce se doreste a fi sters. Functia DELETE verifica mai intai daca tabelul exista in baza de date si in caz contrar afiseaza un mesaj de eroare. In cazul in care tabelul exista se verifica daca acesta este primul din lista, caz in care pointerul tables al bazei de date trebuie modificat (modificam capul de lista al listei de tabele). Daca nu este primul din lista, atunci se elibereaza spatiul tabelului dupa care se refac legaturile in lista. Pentru a afisa intreaga baza de date se foloseste comanda PRINT_DB. La introducerea acestei comenzi se apeleaza functia PRINT_DB care primeste ca parametriu baza de date. In cadrul functiei se realizeaza o parcurgere a bazei de date: se parcurge lista de tabele, element cu element, pentru fiecare tebel se parcurge lista de coloane si se afiseaza urmata de o secveta de "-" pe linia urmatoare. Pentru alinierea coloanelor am folosit padding de ' ' pana se ajunge la 30 caractere. Apoi se parcurge lista de celule de tip cap de linie si pentru fiecare element din aceasta lista se parcurge lista de celule spre care indica pointerul cells si se afiseaza. De asemenea, pentru alinierea infomatiei din coloane am folosit padding ' ' pana se ajunge la maximul de 30 de caractere. Initial am incercat sa fac aceasta aliniere la afisare, atat pentru informatie de tip string cat si pentru int si float, dar ulterior mi-am dat seama ca ar fi mai usor in cazul informatiei int si float sa am deja toate cele 30 caractere (informatie + padding) in celula inca de la alocare si citire. Pentru a realizeaza acest lucru am folosit functia sprintf pentru a face conversia din int/float in string cu scopul de a determina mai usor numarul de caractere al informatie. Apoi pe baza acestui numar de caractere se determina numarul de spatii albe necesare care sunt adaugate prin concatenarea rezultatului functiei sprintf cu rezultatul functiei GetSpaces. Pentru a afisa un singur tabel din baza de date se foloseste functia PRINT urmata de numele tabelului ce se vrea a fi afisat. Principiul este similar cu cel al functiei PRINT_DB, doar ca acum in loc de a parcurge lista de tabele si a afisa toata informatia din toate tabelele pe rand, se parcurge lista de tabele si in momentul in care se gaseste numele tabelului cautat se opreste parcurgerea si incepe afisarea. De asemenea, daca nu este gasit niciun tabel cu numele specificat se intoarce un mesaj de eroare. Pentru a interoga baza de date selectiv dupa un anumit tabel, o anumita coloana si o anumita conditie a valorilor din coloana respectiva si foloseste functia SEARCH. Pasii urmati in implementarea acestei comenzi sunt: - parcurgerea listei de tabele si localizarea tabelului cautat. In cazul in care nu exista un tabel cu numele cautat, se intoare un mesaj de eroare. - Parcurgerea listei de coloane si localizarea coloanei cautate. In cazul in care nu exista o coloana cu numele cautat, se intoarce un mesaj de eroare. De asemenea la parcurgerea listei de coloane se numara si elementele pentru a sti la a cata celula din lista ne-am oprit si implicit ce valori din listele de linii le compar cu valoarea de referinta. - Parcurgerea listei de linii si pentru fiecare cap de linie, parcurgerea listelor corespunzatoare pointerului cells, pana la celula cu numarul indicat anterior. - Verificare daca valoarea indicata de pe fiecare linie respecta conditia - Daca conditia este respecta se afiseaza initial capul de tabel (lista de coloane + succesiunea de '-' pe randul urmator) si apoi intreaga linie pe care a fost gasita informatia. - Se trece la tabelul urmator Pentru a putea adauga linii intr-un tabel deja existent din baza de date se foloseste comanda ADD. La primirea comenzii ADD + numele tabelului in care se face inserarea si valorile ce se doresc a fi inserate se apeleaza o functie ce primeste ca parametrii adresa bazei de date si numele tabelului. In cazul in care tabelul cautat nu exista in baza de date se va afisa un mesaj de eroare. Functia parcurge lista de tabele, la intalnirea tabelului dorit opreste parcurgerea. In functie de tipul de date pe care il contine tabelul, sunt apelate functiile specifice (AlocIntLine/ALocFloatLine/AlocSTRINGLine) de alocare pentru un noua celula de tip cap de linie si functiile ReadCells care citesc de la stdin informatia si aloca celulele necesare pentru formarea noii linii. Dupa ce au fost facute alocarile si citirile, linia nou creata se leaga de tabel in functie de anumite conditii: daca tabelul este gol la momentul inserarii atunci pointerul lines din structura tabelului va pointa spre aceasta noua linie sau daca tabelul nu este gol, atunci inserarea noii linii se va face parcurgand lista existenta de linii pana la final si legarea la (ultima_linie)->next. Pentru a face stergere selectiva din baza de date pe baza numelui unui tabel existent, a unei coloane din tabelul respectiv si a unei conditii pentru informatia continuta pe coloana se foloseste o alta comanda DELETE. Spre deosebire de precedenta comanda DELETE care primea ca parametru numele unui tabel si avea rolul de a-l sterge in intregime, aceasta functie primeste 4 parametrii. Diferentierea in main intre cele 2 functii este facuta pe numarul de parametrii pe care ii primeste comanda in linia de comanda. Pentru a numara comenzile si a face apelul functiei corespunzatoare se foloseste un buffer in care se citeste un string pana la new line. Apoi stringul este impartit in mai multe substringuri cu la intalnirea caracterelor ' ' si '\n'. Aceste substringuri sunt plasate in ordine intr-o matrice si sunt date ca parametrii la apel functiilor de DELETE, respectiv DELETESELECT, in functie de caz. Singurul elemet din matricea de comenzi ce sufera modificari inainte de a fi dat ca parametru la apel este numele coloanei caruia ii este adaugat padding. Principiul stergerii selective este aproape identic cu principiul cautarii selective in baza de date, cu exceptia faptului ca acum, la intalnirea valorilor ce satisfac conditia de comparatie de la input, nu mai sunt afisate liniile ce contin aceste valori. Liniile respective sunt sterse si se refac legaturile in tabel dupa caz: este stearsa fie prima linie, caz in care pointerul lines trebuie modificat, fie o linie din interiorul listei de linii, diferita de prima, fie nicio linie.
database's People
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.