Cor4 szerver kapcsolat
A kapcsolat titkosítására RC6 kódot használunk, melynek legfontosabb tulajdonsága, hogy szimmetrikus, azaz mindössze egy kódra van szükség, ami ráadásul tetszőleges jelsorozat lehet (nem kell prímnek lennie).
Az alapötlet szerint ez a kód a jelszó MD5 kódja, így a kliensen nincs szükség sem a jelszó sem a kód tárolására valamint a jelszó ismerete nélkül az esetleges elkapott üzenet is értelmezhetetlen marad.
A kommunikáció bináris csomagokat alkalmaz a nagy adatmennyiségek hatékony átvitele céljából. Minden csomag egy négy bájtos hosszal kezdődik, amely a teljes csomag (a négy bájtos hosszon kívüli) méretét adja meg. A csomag hossza kódolt üzenet esetén is kódolatlan. Ezután egy bájton a csomag tipusa következik, majd az egyes csomagokra jellemző adatok.
A következőkben az egyes üzenetek formátumát foglalom össze. Az egyes tipusokról itt olvashat bővebben.
Általános csomagok
OK
| Megnevezés | Tipus | Érték |
|---|---|---|
| Csomag hossz | integer | |
| Csomag tipus | byte | 00 |
| Megválaszolt csomag tipusa | byte | |
| Véletlen adat | string |
ERROR
| Megnevezés | Tipus | Érték |
|---|---|---|
| Csomag hossz | integer | |
| Csomag tipus | byte | 255 |
| Megválaszolt csomag tipusa | byte | |
| Hibakód | integer | |
| Hiba szövege | string | |
| Véletlen adat | string |
Kapcsolatfelvétel, bontás
LOGIN
A kliens küldi a szervernek. Az egyetlen kódolatlan üzenet, mely egyelőre csak a felhasználó nevét és a kliensverzió számát tartalmazza.
A válasz már kódolt. Amennyiben a megadott felhasználó létezik, akkor a válasz egy OK üzenet, amely a felhasználó jelszavának MD5 kódjával kódolt. Amennyiben a megadott felhasználó nem létezik, akkor a válasz egy ERROR üzenet véletlenszerű kóddal kódolva.
| Megnevezés | Tipus | Érték |
|---|---|---|
| Csomag hossz | integer | |
| Csomag tipus | byte | 01 |
| Felhasználó neve | string | |
| Kliens verzió | 4 byte | 1.2.3.4 |
DISCONNECT
A kliens küldi a szervernek, melynek hatására a szerver egyszerűen megszakítja a kapcsolatot.
| Megnevezés | Tipus | Érték |
|---|---|---|
| Csomag hossz | integer | |
| Csomag tipus | byte | 02 |
Adminisztráció
CHPASS
A kliens küldi a szervernek a jelszó megváltoztatása céljából. A szerver ennek hatására egy OK vagy egy ERROR üzenetet küld. Nyilvánvalóan a jelszó csak az OK üzenet visszajelzése esetén valósul meg. A kódolás a következő bejelentkezésig nem változik.
| Megnevezés | Tipus | Érték |
|---|---|---|
| Csomag hossz | integer | |
| Csomag tipus | byte | 03 |
| Új jelszó MD5 kódja base64 kódolva | string |
Adatbázis műveletek
QUERY
A kliens által küldött lekérdezést tartalmazza. Mivel a szerver mögött tetszőleges adatbáziskezelő lehet, érdemes odafigyelni arra, hogy a küldött lekérdezés minden adatbáziskezelő által emészthető legyen.
Amennyiben a lekérdezés hibát okoz a szerver ERROR üzenettel válaszol. Amennyiben a lekérdezés egy SELECT SQL utasítás, akkor a visszaadott csomag RESULT tipusú. Minden egyéb esetben (UPDATE, INSERT stb.) egy OK üzenetet kapunk.
| Megnevezés | Tipus | Érték |
|---|---|---|
| Csomag hossz | integer | |
| Csomag tipus | byte | 04 |
| Lekérdezés | string |
RESULT_HEAD
A szerver által adott válasz a QUERY üzenetre.
| Megnevezés | Tipus | Érték |
|---|---|---|
| Csomag hossz | integer | |
| Csomag tipus | byte | 05 |
| Mezőnevek | stringlist | |
| Mezőtipusok | n db byte | az egyes bájtok a megfelelő oszlop tipusát adják meg a lentebbi táblázat szerint |
| Sorok száma | integer |
Ezután az üzenet után Sorok száma számú RESULT_ROW üzenet következik.
Az alábbi táblázat adja meg a Mezőtipusok mezőben definiált tipusok jelentését. A tárolás a tipusnak megfelelően történik.
| Érték | Megnevezés | Értékkészlet |
|---|---|---|
| 1 | integer | -232…232-1 |
| 2 | string | |
| 3 | boolean | true/false |
| 4 | numeric | tetszőleges szám 1) |
| 5 | date |
RESULT_ROW
A lekérdezés eredményének egyes sorai.
| Megnevezés | Tipus | Érték |
|---|---|---|
| Csomag hossz | integer | |
| Csomag tipus | byte | 06 |
| Sorszám | integer | a csomag lekérdezésbeli sorszáma |
| Adat | raw | a fejléc által definiált mezők elválasztójel nélkül |
Példa
Példaként álljon itt egy két oszlopos lekérdezés eredménye (SELECT id,nev FROM varos LIMIT 5), ahol az id integer tipusú, a nev pedig természetesen string. A számok decimális számok.
| Megnevezés | Érték |
|---|---|
| Csomag hossz | 18 0 0 0 |
| Csomag tipus | 5 |
| Mezőnevek | 2 0 0 0 2 0 105 100 3 0 110 101 118 |
| Mezőtipusok | 1 2 |
| Sorok száma | 5 0 0 0 |
| Megnevezés | Érték |
|---|---|
| Csomag hossz | 21 |
| Csomag tipus | 6 |
| Sorszám | 1 0 0 0 |
| Adatok | 1 0 0 0 8 0 98 117 100 97 112 101 115 116 5 |
| Megnevezés | Érték |
|---|---|
| Csomag hossz | 16 |
| Csomag tipus | 6 |
| Sorszám | 2 0 0 0 |
| Adatok | 1 0 0 0 5 0 122 111 109 98 97 |
| Megnevezés | Érték |
|---|---|
| Csomag hossz | 18 |
| Csomag tipus | 6 |
| Sorszám | 3 0 0 0 |
| Adatok | 1 0 0 0 7 0 114 97 107 97 109 97 122 |
| Megnevezés | Érték |
|---|---|
| Csomag hossz | 14 |
| Csomag tipus | 6 |
| Sorszám | 4 0 0 0 |
| Adatok | 1 0 0 0 3 0 97 98 97 |
| Megnevezés | Érték |
|---|---|
| Csomag hossz | 19 |
| Csomag tipus | 6 |
| Sorszám | 5 0 0 0 |
| Adatok | 1 0 0 0 8 0 97 98 97 108 105 103 101 116 |