GithubHelp home page GithubHelp logo

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

Contributors

runtimeerrorgr avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.