[C/SQL] Własny silnik relacyjnej bazy danych

0

Witam.
Mam do napisania projekt zaliczeniowy na zajęcia z systemów rozproszonych.

Treść:

Serwer + Klient bazy danych SQL’owej

  1. Serwer wspólbiezny: watki
  2. Komunikacja: kolejki fifo
  3. Baza danych – wszystkie bazy danych, tabele i pliki indeksowe znajduja sie w
    jednym pliku )
  4. Akceptowalne polecenia sql’a (create, insert, delete, update, select) + blokady na
    poziomie rekordów
  5. Unix, jezyk C, tryb tekstowy (biblioteka curses)

Problem w tym, że nie bardzo wiem jak mam się do tego zabrać.

Na zajęciach doktor nie omawiał z nami sposobów integracji
bazy danych SQL z programami w c, więc od tego chciałbym zacząć.
Googlowałem temat, ale nic konkretnego nie udało mi się znaleźć.
Większość materiałów z tej dziedziny dotyczy MySQL,
ponieważ temat projektu dostałem zaraz przed świętami,
nie dowiedziałem się, czy można użyć MySQL, zamiast SQL.

Proszę was więc o jakieś rady, może ktoś mógłby mi polecić ebook'a na ten temat ?
Linki do przykładowych programów również mile widziane ;-P

0

SQL jest to Structured Query Language. MySQL jest to silnik BD implementujący obsługę SQL. Nie ma czegoś takiego jak użyć SQL. Musisz bazę postawić na jakimkolwiek silniku (MySQL, PostgreSQL, SQLite, MS SQL Express, Firebird, Interbase). Wszystkie one implementują "SQL".

0

Adamie, z tego co pobieżnie przeczytałem, to on ma stworzyć taki własny silnik DB ;)

Hm, może ta książka http://www.wnt.com.pl/product.php?action=0&prod_id=397&hot=1 ?

0

Dzięki Coldpeer, otworzyłeś mi oczy, teraz przynajmniej wiem o co
naprawdę chodzi w tym projekcie. Oczywiście nie będzie to proste a czas goni.
Zacznę od logowania usera do systemu w razie problemów będę się kontaktował.

Wymyśliłem taki sposób logowania do systemu, proszę o ocenę:

Założenia:

W systemie jest jedna wspólna kolejka logowania dla wszystkich userów ( wszyscy znają jej nazwę ).
Po zalogowaniu każdy user jest obsługiwany przez nowy wątek,
oraz ma przydzielone 2 kolejki komunikatów: do pisania i do odczytu.

  1. User loguje się do systemu z jakimś nickiem.
    Ten krok jest ważny, ponieważ na początku istnieje tylko kolejka logowania
    od userów do serwera i user musi wiedzieć jak będą się nazywać kolejki
    komunikatów za pomocą których będzie się po zalogowaniu komunikował z serwerem.

  2. Logowanie odbywa się przez kolejkę logowania, stale obecną w systemie.

  3. Serwer czyta z kolejki login usera. Na jego podstawie tworzymy 2 kolejki:

    nazwa_useraSK.fifo - do komunikacji serwer-klient
    nazwa_useraKS.fifo - do komunikacji klient-serwer

Może zaistnieć sytuacja, że user o podanym nicku już pracuje w systemie, wtedy można np.

stworzyć plik:
nazwa_usera_denied.fifo

  1. Ponieważ wykonanie 3 kroku może zająć serwerowi jakiś czas, user powinien
    kolejno:

    • sprawdzać, czy utworzono 2 kolejki komunikatów o nazwach pochodzących
      od jego loginu, lub kolejkę denied, blokującą mu dostęp do systemu
      ( po otrzymaniu odmowy dostępu powinien mieć szansę na ponowne zalogowanie
      pod innym nickiem ).

    • w przypadku braku tych kolejek zasypiać na jakiś czas, po czym powtórzyć
      pierwszą czynność

// przeniosłem do działu Nietuzinkowe, bo tutaj może więcej osób mających coś do powiedzenia w temacie zainteresuje się tym wątkiem (i dostrzeże go w ogóle). PS poprawiłem temat - Cold

0

Witam, ja mam do zrobienia projekcik podobny do RJM dokładnie taki:

Serwer + Klient bazy danych SQL’owej

  1. Serwer wspólbiezny: watki
  2. Komunikacja: kolejki fifo
  3. Baza danych – wszystkie bazy danych, tabele i pliki indeksowe znajduja sie w
    jednym pliku )
  4. Akceptowalne polecenia sql’a (create, insert, delete, update, select) + tranzakcje
  5. Unix, jezyk C, tryb tekstowy tryb graficzny X-windows

Jesli ktos by wiedzial jak to napisac lub mial ochote mi pomoc to prosze o kontakt na gg:4556854
na pewno sie dogadamy :-)

// z takimi jawnymi ogłoszeniami to do działu Off-topic -> Praca - Cold

0

Udało się przeciągnąć termin oddania projektu :D

Martwi mnie ten punkt:

  1. Baza danych – wszystkie bazy danych, tabele i pliki ( pliki w pliku :| - pomyłka )
    indeksowe znajduja sie w jednym pliku.

Nie wiem jak ma wyglądać taka baza danych w jednym pliku.

Nie wiem też jak mają wyglądać te pliki indeksowe ani jak
ich używać do przeglądania pliku z bazą ?

Macie jakieś pomysły?

0

Eh, trochę rozbudowany ten projekt masz.
Pierwszą wersję PostgreSQL w C tworzył jeden mocny koleś (chyba dr lub wyżej) + 4 studentów przez ok. 2 lata. H2 tworzył w Javie jeden niezły hacker przez ok. 3 lata.
Pół roku zajęło mi napisanie podstawowego optymalizatora zapytań, kompilatora SQL, ewolucyjnego doradcy indeksów i zarządcy metadanych, a to tylko niewielka część silnika RDBMS. Szacuję, że ok. roku zajęłaby mi reszta, ale nie to jest moim celem.

Z tego mozna wyciagnac jakieś wnioski odnośnie ogromu pracy.

A Ty masz zrobić RDBMSa w semestr? 8-O
No chyba, że to będzie bardzo okrojony RDBMS. Tylko jaki sens robić coś takiego?

A ta książka jest ogólnie niezła, ale żeby ją opanować w stopniu wyst. by cokolwiek zaimplementować, to niestety parę miesięcy trzeba, jeśli się nie miało w tej dziedzinie wcześniej przygotowania. Gotowych kodów w niej nie ma.

0

Zawsze mozna przejrzec zrodla MySQL, sqlite albo innej bazy open source (jezeli mowa o gotowych kodach).

0

Źródełka SQLite mają raptem 25000 wierszy kodu. Analiza obcego programu powyżej 5000 wierszy dla mnie jest już dość trudna. 25000 to jest co robić

0

Dodam, że SQLite jest bardzo prostym RDBMSem. Chyba jednym z najprostszych.
Nie widziałem jego kodu, więc nie wiem, czy jest trudny do zrozumienia czy nie. Próbowałem kiedyś dłubać cos w PostgreSQL i MySQL, i po paru dniach stwierdziłem, że łatwiej jest napisać kompilator/optymalizator zapytań samemu od zera.

Krótko, co musi być (w każdym, nawet najprostszym RDBMSie):

  1. Lexer + parser SQL - da się wygenerować odp. narzędziem z gramatyki. Podstawowa gramatyka zmieści się w ok. 100 liniach. Gramatyki do SQLa walają się gdzieś po sieci, ale często są zbyt rozbudowane. W 3 dni da obskoczyć, jeśli znasz dobrze narzędzia i SQLa.

2a. Reprezentacja operatorów algebry relacyjnej i drzew. Do tego aż prosi się wziąć język obiektowy. W samym C nie ma najmniejszego sensu się męczyć, choć się da. Będziesz miał z tego kilka klas po kilkadziesiat / kilkaset linii.

2b. Reprezentacja metadanych - tzn. system musi wiedzieć, jakie są tabele, jakie mają kolumny, jakich typów itd. Metadane muszą być zapisywalne w pliku bazy. To jest proste, ale żmudne. Znowu C bym odradzał, bo tu się bardzo przydają wszelkiego rodzaju kontenery (wektory, tablice asocjacyjne itp.).

  1. Kompilator zamieniający drzewa składni w drzewa algebry relacyjnej. Na tym etapie dokonuje się też analizy semantycznej - tzn. wiąże się identyfikatory w zapytaniu z konkretnymi tabelami / kolumnami. Jeśl nie da się powiazać, zgłasza się błędy. U mnie ten fragment (Java) ma ok. 850 linii z komentarzami.

3a. Optymalizator zapytan. Od biedy można walnąć w 3 dni coś super naiwnego co zastosuje jakieś heurystyczne reguły (podejście MySQLa, SQLite) - np. użycie pierwszego lepszego dostępnego indeksu, gdzie można. Na kosztowy optymalizator w Twoim przypadku bym się nie porywał, choć to jest de facto w tej chwili standard w dobrych RDBMSach.

  1. Implementacja fizyczna operatorów relacyjnych. W końcu coś musi odczytać dane z dysku i je przetworzyć zgodnie z planem zapytania. Minimalny zestaw:
  • projekcja (tzn. wyciągnięcie odp. kolumn oraz ewentualnie policzenie jakiegoś wyrażenia)
  • filtrowanie rekordów na postawie zadanego warunku
  • złączenie tabel (najłatwiejsze naiwne przez zagnieżdżone pętle)
  • sortowanie (external sort)
  • sekwencyjny odczyt tabeli
  • sekwencyjny odczyt indeksu powiązany z równoczesnym odczytem przypadkowym tabeli
  1. Zarządca buforów. Trzyma najczęściej używane dane w pamięci i stara się je "mądrze" zapisywać na dysk. Bez tego w sumie można się obyć i zwalić to na system op (jak w PostgreSQL). Niemniej nadal potrzebujesz coś co czyta dane z dysku całymi blokami i wyższej warstwie udostępnia interfejs w postaci osobnych rekordów.

  2. Zarządca blokad. Dwuetapowe blokowanie wydaje się dosyć proste do zaimplementowania - najprościej blokować całe tabele, ale jest to oczywiście strasznie lamiaste...

  3. Implementacja indeksów - jeden typ musisz mieć. B-drzewo wydaje się absolutnym minimum. Implementacja B-drzewa jest u nas na wydziale chyba na jakimś przedmiocie jednym z projektów (trwa 1 semestr). Na sieci jak dobrze pogrzebać jakieś kody źródłowe mozna znaleźć. No, można też zerżnąć kawałki kodu z MyISAM.

  4. Dodatki takie jak interfejs użytkownika, zarządzanie kontami, bezpieczeństwo. Tak naprawdę w porównaniu z całą resztą to to już są kosmetyczne pierdułki.

Jeśli serio macie coś takiego zrobić na projekt, to tego gościa pogięło. Dla mnie to jest za dużo nawet na magisterkę. Poza tym, powiedział, po co to ma być? To jest jakiś przedmiot z baz danych czy co? A może Wy to macie zrobić zespołowo w 10 osób? (też miałbym wątpliwości - 10 osobowy zespół na uczelni działa wolniej niż zespół jednoos.)

0

Czy jestes przekonany ze masz napisac silnik SQL? Moim zdaniem to troche niewykonalne (tak delikatnie mowiac, zeby Cie nie zrazac). Tym bardziej ze chodzi tu o zaliczenie... W zasadzie to temat na doktorat. Moze dopytaj goscia czy go dobrze rozumiesz...

0

Cos mi sie zdaje, ze chodzi o napisanie serwera wykorzystujacego jakas bazke sql. Widzac posty autora (i jego znajomosc tematu) i fakt, ze to na zaliczenie, to inna interpretacja jest dosc nierealna. Zreszta widac po postach Krolika, jakie to wszystko latwe ;)

0

Żeby tam chodziło o wykorzystanie zwykłej bazki sql ... mamy silnik napisać, wiem co pisze, bo ta sama uczelnia :P i podobny temat :P

0

Z ciekawości - gdzie takich cudów wymagają ?

0

Witam, mam taki sam problem jak wyżej. Nie mam pojecia jak sie za to zabrac a pasowałoby przedmiot zaliczyc. Jeśli ktoś chciałby pomóc, myślę że sie dogadamy ;)

Mój temat:

Serwer + Klient bazy danych SQL’owej

  1. Serwer wspólbiezny: procesy
  2. Komunikacja: kolejki fifo
  3. Baza danych – wszystkie bazy danych, tabele i pliki indeksowe znajduja sie w
    jednym pliku )
  4. Akceptowalne polecenia sql’a (create, insert, delete, update, select) + tranzakcje
  5. Unix, jezyk C, tryb tekstowy (biblioteka curses)
0

To ja założyłem ten temat. Po 3 tygodniach główkowania udało się nam z kolegą stworzyć b. prosty silnik - wystarczył żeby zaliczyć.
Skontaktuj się ze mną, jeżeli jesteś zainteresowana:

[email protected]

0

Z góry przepraszam za odgrzewanie starego tematu, ale co roku dostaję kilka maili od studentów, odnośnie tego projektu. W tym roku było ich 6, więc uznałem, że podzielę się tym co stworzyłem 8 lat temu razem z kolegą Tomkiem, jako nieopierzony programista. Patrząc po latach trochę się go wstydzę, ale każdy od czegoś zaczynał. Bardzo proszę przeczytać readme, przed wysłaniem zapytań: https://github.com/RomekRJM/RDBMS_From_Uni/blob/master/README.md . Pozdrawiam doktora Święcickiego, jeżeli to czyta :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1