602SQL-Úplná dokumentace Index  

Začátek a konec práce klienta

Zde popisujeme postup připojení se klienta na 602SQL server a odpojení se.

Pro Delphi jsou k dispozici komponenty (CDK komponenty), odvádějící tuto inicializační a deinicializační práci (nebo její část) požadovaným způsobem. Jich lze využít pro zjednodušení práce.

Kontextová proměnná klienta

Každý klient, který se chce připojit na databázový server 602SQL, musí mít tzv. kontextovou proměnnou cd typu cd_t pro průběžné uložení informací o kontextu komunikace.

Klient musí:

  1. Vytvořit proměnnou cd typu cd_t buď tak, že ji staticky deklaruje, nebo tak, že ji dynamicky alokuje, nejlépe voláním funkce cdp_alloc.
  2. Inicializovat tuto proměnnou voláním funkce cdp_init. Tuto akci je nezbytně nutné provést před voláním ostatních funkcí využívajících kontextovou proměnnou.
  3. Předávat tuto proměnnou těm API funkcím, které ji vyžadují (obvykle jako první parametr). V Pascalu se předává odkazem, v jazyce C/C++ se předává ukazatel typu cdp_t, který na ní ukazuje.
  4. Byla-li proměnná cd alokována pomocí cdp_alloc, dealokovat tuto proměnnou po odpojení se od serveru voláním funkce cdp_free.

Alokujete-li proměnnou cd ve vlastní správě paměti, můžete zjistit její potřebnou velikost voláním funkce cdp_size.

Klient se může současně připojit na více serverů nebo si vytvořit vícenásobné spojení na stejný server. V takovém případě musí mít více kontextových proměnných. Více paralelních spojení klienta na server však znemožňuje používat nástroje uživatelského rozhraní zabudované do 602SQL.

Funkce s prefixem cd_

Klientský program má k dispozici dvě sady funkcí pro komunikaci se serverem. Funkce, začínající prefixem cd_ mají oproti funkcím bez tohoto prefixu jeden parametr navíc - prvním parametrem je kontextová proměnná cd resp. ukazatel na ni. Nově přidávané funkce mají většinou již pouze variantu s cd_. V textu jsou však na ně odkazy (většinou) bez tohoto prefixu.

Funkce s prefixem cd_ je nutno používat tehdy, pokud spojení na server vytvoří jedno vlákno a používá je jiné, nebo pokud současně existuje více paralelních spojení na servery. Pokud klient má pouze jedno vlákno připojené na jediný server, ale používat obě sady funkcí se stejným efektem.

Práce více vláken klienta s databází

Pokud každé vlákno klienta komunikuje s databází pouze prostřednictvím spojení, které si samo vytvořilo, a používá funkce s prefixem cd_, pak rozhraní na server funguje reentrantně a činnost vláken není nutno na klientské straně nijak synchronizovat. Pokud vlákna budou současně pracovat se stejnými daty, je třeba počítat s možností deadlocku na serveru.

Pokud klient má více vláken a vlákno může využívat spojení vytvořené jiným vláknem, pak:

Jinými slovy vlákno, které chce pracovat s databází, si vybere spojení a provede na něj funkci cd_assign_to_thread. Pak může pracovat a po skončení práce zavolá cd_unassign. Po tuto dobu spojení nesmí být přiřazeno žádnému jinému vláknu ani využíváno žádným jiným vláknem.

Slupka klientské aplikace

Připojení se na server

Každý klient musí zvolit server, s nímž bude komunikovat. Vybrat si lze pouze z takových serverů, které jsou zaregistrovány na počítači, na němž běží klient, nebo které běží ze stejném segmentu sítě (pouze je-li u klienta povoleno hledání serveru).

Připojení klienta na zvolený server provádí funkce cd_connect se jménem serveru předaným jako parametr.

Klient se odpojí od serveru zavoláním funkce cd_disconnect. Tato funkce musí být zavolána před ukončením práce klienta a před případnou dealokací proměnné cd.

Přihlášení a odhlášení

Klient se na server přihlašuje pod určitým uživatelským jménem. Server může povolit také anonymní přístup, k němu však obvykle přísluší velmi omezená práva.

K přihlášení se slouží funkce (cd_)Login. Parametry této funkce jsou jméno uživatele a heslo. Server prověří, zda uživatele má v seznamu a zda souhlasí heslo. Pokud je vše v pořádku, je přihlášení se klienta na server provedeno.

Funkci (cd_)Login lze zavolat až po úspěšném provedení funkce cd_connect.

Klient přihlášený na server může své uživatelské jméno zjistit pomocí funkce (cd_)Who_am_I.

Opakem přihlášení se na server je odhlášení, které provede funkce (cd_)Logout. Po odhlášení se klient stává anonymním a může se později přihlásit pod jiným jménem.

Aplikační program může uživateli umožnit odhlásit se a později se znovu přihlásit, pokud uživatel odchází od počítače a nechce, aby někdo zneužil jeho práv.

Funkce (cd_)Login a (cd_)Logout se musí volat mezi voláním funkcí cd_connect a cd_disconnect.

Volba schématu

Klient by měl zvolit databázové schéma, v němž se nacházejí objekty, s nimiž hodlá pracovat. Na objekty ve zvoleném schématu pak může odkazovat pouze jejich jménem, zatímco na objekty z jiných schémat musí odkazovat složitějším zápisem ve tvaru:

jméno_schématu.jméno_objektu

Schéma lze zvolit voláním funkce (cd_)Set_application.

Nové schéma lze vytvořit pomocí funkce (cd_)Insert_object nebo pomocí SQL příkazu CREATE SCHEMA.

Přehled pořadí akcí

Komunikace klienta s databázovým serverem musí být uzavřena do slupky funkcí v tomto pořadí:

  1. alokace kontextové proměnné typu cd_t, není-li alokována staticky;
  2. volání cdp_init;
  3. vytvoření hlavního okna (nebylo-li otevřeno dříve a je-li potřeba) a inicializace okenního prostředí;
  4. volání cd_connect;
  5. volání (cd_)Login, pracuje-li se neanonymně;
  6. volání (cd_)Set_application;
  7. vlastní aplikace
  8. volání (cd_)Logout - nepovinné;
  9. volání cd_disconnect;
  10. dealokace kontextové proměnné, není-li alokována staticky;
  11. zavření hlavního okna aplikace, existuje-li.

Příklad pro Delphi

uses krnl602_10;

var my_cd:  cd_t;     // kontextova promenna klienta
    err:    integer;  // stav pripojeni klienta 
    logged: boolean;  // klient je uspesne prihlaseny

procedure TForm1.FormCreate(Sender: TObject);
begin
  cdp_init(@my_cd);            //inicializace kontext. promenne klienta
  err:=cd_connect(@my_cd, 'test', sw_minimize); //propojeni klienta k serveru test
                                                //server test musi byt zaregistrovany
  if err=KSE_OK then begin 			  
    logged:=not cd_Login(@my_cd,'','');      //prihlaseni se k serveru jako anonymní
    if logged then
      cd_Set_application(@my_cd, 'testap');  //nastaveni schematu (aplikace)
  end;	
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if err=KSE_OK then        //pokud bylo pripojeno
    cd_disconnect(@my_cd);  //ukonceni prace a odhlaseni od 602SQL, ukonceni spojeni
end;