DBC konteiner slouží pro uchování informací o tabulkách a položkách , které z důvodu kompatibility nemohly být přítomny ve struktuře tabulek. Dále se v něm ukládají uložené procedury, pohledy, spojení na vzdálená data, relace a definice referenční integrity.
1) Struktura DBC konteineru
DBC konteiner je pouhá VFP tabulka. Lze ji tedy otevřít a přehrabovat se v ní. Je nutno míti na paměti, že neodborný zásah může způsobit problémy při otevírání samotné databáze, pohledů či tabulek. Při neopatrném přepsání položky "Property" dochází k pádu samotné VFP.
Tab. 1.0 Struktura DBC konteineru
Název | Typ | Velikost | Popis |
OBJECTID | I | 4 | ID objektu |
PARENTID | I | 4 | ID otcovkého objektu |
OBJECTTYPE | C | 10 | Typ objektu, viz Tab. 1.1 |
OBJECTNAME | C | 128 | Název objektu |
PROPERTY | M bin | 4 | Memo pole pro uchování vlastností |
CODE | M bin | 4 | Memo pole pro uchování P-kódu uložených procedur |
RIINFO | C | 6 |
Příznak pro objekt typu "RELACE", že je vygenerována RI. Pokud je hodnota ICR, pak jednotlivá písmena znamenají: ICR - Update Ignorován, Cascade Delete,Restriktivní Insert |
USER | M | 4 | Memo pole pro vlastní použití |
Kód | Popis |
Database | Databáze |
Table | Tabulka |
Index | Index |
Field | Položka |
Relation | Relace |
Connection | Spojení |
View | Pohled |
Každý objekt má ID ("OBJECTID"), které ho jednoznačně identifikuje v rámci DBC konteineru a zároveň v položce "PARENTID" je ID otcovského objektu.
Databáze vlastní tabulky, pohledy ,spojení a je též vlastníkem sama sebe a několika dalších objektů viz Tab. 1.2 .
Tabulka vlastní položky,indexy a relace.
Pohled vlastní položky a relace.
Tab. 1.2 Seznam objektů po založení DBC konteineru
Název | ID | Popis |
Database | 1 | Samotná databáze |
TransactionLog | 2 | ??? - Patrně záznamy o transakcích |
StoredProceduresSource | 3 | V položce "CODE" jsou uloženy zdrojové kódy procedur včetně procedur RI |
StoredProceduresObject | 4 | V položce "CODE" jsou uloženy P-kódy procedur včetně procedur RI |
StoredProceduresDependencies | 5 | ??? |
Následná tabulka zobrazuje možný obsah DBC konteineru, pokud jej otevřeme pomocí příkazu USE a zobrazíme v browsu.
Tab. 1.3 Ukázka z DBC konteineru
OBJECTID | PARENTID | OBJECTTYPE | OBJECTNAME | PROPERTY | CODE | RIINFO | USERID |
1 | 1 | Database | Database | Memo | memo | memo | |
2 | 1 | Database | TransactionLog | memo | memo | memo | |
3 | 1 | Database | StoredProceduresSource | memo | Memo | memo | |
4 | 1 | Database | StoredProceduresObject | memo | Memo | memo | |
5 | 1 | Database | StoredProceduresDependencies | memo | memo | memo | |
14 | 1 | Connection | Connect1 | Memo | memo | memo | |
15 | 1 | Table | XXT001 | Memo | memo | memo | |
16 | 15 | Field | Pol1 | Memo | memo | memo | |
20 | 15 | Index | XXI001 | Memo | memo | memo | |
22 | 15 | Relation | Relation 1 | Memo | memo | ICR | memo |
30 | 1 | View | View1 | Memo | memo | memo | |
31 | 30 | Field | Polx | Memo | memo | memo |
2) Vlastnosti objektů
Samotné vlastnosti objektů jsou uloženy v poli "PROPERTY". Každá vlastnost je tvořena blokem bytes.
<L0> <L1> <L2> <L3> <N0> <N1> <B0> ... <Bn> <Hodnota>
Kde <L0> až <L3> určuje celou délku bloku. Jde o 32 Unsigned Integer.
<N0> a <N1> určuje délku ID vlastnosti v bytes. Jde o 16 Unsigned Integer.
<B0> ... <Bn> je ID vlastnosti.
Jde o n Unsigned Integer (kompletní seznam vlastností je v tabulce Tab. 2.1).
Zbytek bloku zabírá vlastní hodnota.
Hodnota dosahuje několika typů jak ukazuje tabulka Tab. 2.0.
Tab. 2.0 Tabulka typů vlastností
Kód | Popis |
char | Řetězec ukončený znakem CHR(0) |
bool | Logická hodnota 1 - .T., 0 -.F. |
byte | Numerická hodnota o velikosti 1 byte |
uir |
Hodnota typu 32 integer bez znaménka zapsaná v obráceném sledu. Vlastnosti dosahující hodnoty -1 jsou zapsány jako 0xFFFFFFFF |
Největší zvláštností je hodnota uir, která je uložena v obráceném sledu, než je zvykem. Další výjimku tvoří hodnota -1, která je uložena jako 0xFFFFFFFF. Hodnota typu bool je uložena pomocí jednoho byte, kde hodnota 1 odpovídá .T. a 0 odpovídá .F. .
Tab. 2.1 Tabulka vlastností jednotlivých objektů
Vlastnost | ID | Typ | Ukázková hodnota | Ukázková vlastnost (Dec) | Ukázková vlastnost (Nativní tvar) | Verze VFP | Poznámka | ||||
Databáze | |||||||||||
Comment | 7 | char | Toto je můj komentář | 28_0_0_0_1_0_7_Toto je můj komentář_0 | 1C000000010007Toto je můj komentář00 | 3.0 | |||||
Version | 24 | uir | 10 | 11_0_0_0_1_0_24_0_0_0_10 | 0B0000000100180000000A | 3.0 |
|
||||
DBCEvents | 86 | bool | 1 | 8_0_0_0_1_0_86_0_0_0_01 | 0800000001005600000001 | 7.0 | |||||
DBCEventFileName | 87 | char | xx.prg | 14_0_0_0_1_0_87_xx.prg_0 | 08000000010057xx.prg00 | 7.0 | |||||
Tabulka | |||||||||||
Path | 1 | char | data\tb.dbf | 19_0_0_0_1_0_1_data\tb.dbf_0 | 13000000010001data\tb.dbf00 | 3.0 | |||||
SubType | 2 | byte | 1 | 8_0_0_0_1_0_2_1 | 0800000001000201 | 3.0 | Vždy 1 | ||||
Comment | 7 | char | Toto je můj komentář | 28_0_0_0_1_0_7_Toto je můj komentář_0 | 1C000000010007Toto je můj komentář00 | 3.0 | |||||
RuleExpression | 9 | char | Table_Valid() | 21_0_0_0_1_0_9_Table_Valid()_0 | 15000000010009Table_Valid()00 | 3.0 | |||||
RuleText | 10 | char | "Nemáte přístup k tabulce" | 34_0_0_0_1_0_10_"Nemáte přístup k tabulce"_0 | 2200000001000A"Nemáte přístup k tabulce"00 | 3.0 | |||||
InsertTrigger | 14 | char | INSTrig() | 17_0_0_0_1_0_14_INSTrig()_0 | 1100000001000EINSTrig()00 | 3.0 | |||||
UpdateTrigger | 15 | char | UPDTrig() | 17_0_0_0_1_0_15_UPDTrig()_0 | 1100000001000FUPDTrig()00 | 3.0 | |||||
DeleteTrigger | 16 | char | DELTrig() | 17_0_0_0_1_0_16_DELTrig()_0 | 11000000010010DELTrig()00 | 3.0 | |||||
PrimaryKey | 20 | char | Uziv_ID | 15_0_0_0_1_0_20_Uziv_ID_0 | 0F000000010014Uziv_ID00 | 3.0 | |||||
Položka | |||||||||||
Comment | 7 | char | Toto je můj komentář | 28_0_0_0_1_0_7_Toto je můj komentář_0 | 1C000000010007Toto je můj komentář00 | 3.0 | |||||
RuleExpression | 9 | char | Field_Valid() | 21_0_0_0_1_0_9_Field_Valid()_0 | 15000000010009Field_Valid()00 | 3.0 | |||||
RuleText | 10 | char | "Hodnota neodpovídá..." | 31_0_0_0_1_0_10_"Hodnota neodpovídá..."_0 | 1F00000001000A"Hodnota neodpovídá..."00 | 3.0 | |||||
DefaultValue | 11 | char | Date() | 14_0_0_0_1_0_11_Date()_0 | 0E00000001000BDate()00 | 3.0 | |||||
Caption | 56 | char | Datum odeslání | 22_0_0_0_1_0_56_Datum odeslání_0 | 16000000010038Datum odeslání00 | 3.0 | |||||
DisplayClass | 50 | char | _mujtextbox | 19_0_0_0_1_0_50__mujtextbox_0 | 13000000010032_mujtextbox00 | 5.0 | |||||
DisplayClassLibrary | 51 | char | XXCLASS.VCX | 19_0_0_0_1_0_51_XXCLASS.VCX_0 | 13000000010033XXCLASS.VCX00 | 5.0 | |||||
InputMask | 54 | char | XX | 10_0_0_0_1_0_54_XX_0 | 0A000000010036XX00 | 3.0 | |||||
Format | 55 | char | !! | 10_0_0_0_1_0_55_!!_0 | 0A000000010037!!00 | 3.0 | |||||
Objekt | Index | ||||||||||
Primary/Candidate | 17 | bool | 1 | 8_0_0_0_1_0_17_1 | 0800000001001101 | 3.0 | |||||
Relace | |||||||||||
ChildTag | 13 | char | InMesto | 15_0_0_0_1_0_13_InMesto_00 | 0F00000001000DInMesto00 | 3.0 | |||||
ParentTable | 18 | char | TaMesto | 15_0_0_0_1_0_18_TaMesto_00 | 0F000000010012TaMesto00 | 3.0 | |||||
ParentTag | 19 | char | InUlice | 15_0_0_0_1_0_19_InUlice_00 | 0F000000010013InUlice00 | 3.0 | |||||
Spojení | |||||||||||
Comment | 7 | char | Toto je můj komentář | 28_0_0_0_1_0_7_Toto je můj komentář_0 | 1C000000010007Toto je můj komentář00 | 3.0 | |||||
DataSource | 29 | char | MS SQL | 14_0_0_0_1_0_29_MS SQL_0 | 0E00000001001DMS SQL00 | 3.0 | |||||
Asynchronous | 64 | bool | 1 | 8_0_0_0_1_0_64_1 | 0800000001004001 | 3.0 | |||||
BatchMode | 65 | bool | 1 | 8_0_0_0_1_0_65_1 | 0800000001004101 | 3.0 | |||||
ConnectString | 66 | char | DSN=test;pwd=bla | 24_0_0_0_1_0_66_DSN=test;pwd=bla_0 | 18000000010042DSN=test;pwd=bla00 | 3.0 | |||||
ConnectTimeout | 67 | uir | 1 | 11_0_0_0_1_0_67_0_0_0_15 | 0B00000001004300000015 | 3.0 | |||||
DispLogin | 68 | byte | 1 | 8_0_0_0_1_0_68_1 | 0800000001004401 | 3.0 | |||||
DispWarnings | 69 | bool | 1 | 8_0_0_0_1_0_69_1 | 0800000001004201 | 3.0 | |||||
IdleTimeout | 70 | uir | 0 | 11_0_0_0_1_0_70_0_0_0_0 | 0B00000001004600000000 | 3.0 | |||||
QueryTimeout | 71 | uir | 0 | 11_0_0_0_1_0_71_0_0_0_0 | 0B00000001004700000000 | 3.0 | |||||
Password | 72 | char | heslo | 13_0_0_0_1_0_72_heslo_0 | 0D000000010048heslo00 | 3.0 | |||||
Transactions | 73 | byte | 1 | 8_0_0_0_1_0_73_1 | 0800000001004901 | 3.0 | |||||
UserId | 74 | char | admin | 13_0_0_0_1_0_74_admin_0 | 0D00000001004Aadmin00 | 3.0 | |||||
WaitTime | 75 | uir | 100 | 11_0_0_0_1_0_75_0_0_0_100 | 0B00000001004B00000064 | 3.0 | |||||
PacketSize | 78 | uir | 0 | 11_0_0_0_1_0_78_0_16_0_0 | 0B00000001004E00001600 | 3.0 | |||||
Database | 79 | char | master | 14_0_0_0_1_0_79_master_0 | 0E00000001004Fmaster00 | 3.0 | |||||
DisconnectRollback | 89 | bool | 0 | 8_0_0_0_1_0_89_0 | 0800000001005901 | 9.0 | |||||
Pohled | |||||||||||
SubType | 2 | byte | 6 | 8_0_0_0_1_0_2_6 | 0800000001000206 | 3.0 | 6 - lokální, 7 - vzdálený | ||||
Comment | 7 | char | Toto je můj komentář | 28_0_0_0_1_0_7_Toto je můj komentář_0 | 1C000000010007Toto je můj komentář00 | 3.0 | |||||
RuleExpression | 9 | char | View_Valid() | 20_0_0_0_1_0_9_View_Valid()_0 | 14000000010009View_Valid()00 | 3.0 | |||||
RuleText | 10 | char | "Nemáte přístup k pohledu" | 34_0_0_0_1_0_10_"Nemáte přístup k pohledu"_0 | 2200000001000A"Nemáte přístup k pohledu"00 | 3.0 | |||||
ParameterList | 12 | char | Pol1,"C";Pol2,"D" | 25_0_0_0_1_0_12_Pol1,"C";Pol2,"D"_0 | 1900000001000CPol1,"C";Pol2,"D"00 | 3.0 | |||||
BatchUpdateCount | 28 | uir | 1 | 11_0_0_0_1_0_28_0_0_0_1 | 0B00000001001C00000001 | 3.0 | |||||
ConnectName | 32 | char | Moje_Spojeni | 20_0_0_0_1_0_32_Moje_Spojeni_0 | 14000000010020Moje_Spojeni00 | 3.0 | |||||
FetchMemo | 36 | bool | 1 | 8_0_0_0_1_0_36_1 | 0800000001002401 | 3.0 | |||||
FetchSize | 37 | uir | 100 | 11_0_0_0_1_0_37_0_0_0_100 | 0B00000001002500000064 | 3.0 | |||||
MaxRecords | 39 | uir | -1 | 11_0_0_0_1_0_39_255_255_255_255 | 0B000000010027FFFFFFFF | 3.0 | |||||
ShareConnection | 40 | bool | 1 | 8_0_0_0_1_0_40_1 | 0800000001002801 | 3.0 | |||||
SourceType | 41 | byte | 1 | 8_0_0_0_1_0_41_1 | 0800000001002901 | 3.0 | |||||
SQL | 42 | char | SELECT * FROM TaMesto | 29_0_0_0_1_0_42_SELECT * FROM TaMesto_0 | 1D00000001002ASELECT * FROM TaMesto00 | 3.0 | |||||
Tables | 43 | char | TaMesto | 15_0_0_0_1_0_43_TaMesto_0 | 0F00000001002BTaMesto00 | 3.0 | |||||
SendUpdates | 44 | bool | 1 | 8_0_0_0_1_0_44_1 | 0800000001002C01 | 3.0 | |||||
UpdateType | 46 | byte | 1 | 8_0_0_0_1_0_46_1 | 0800000001002E01 | 3.0 | |||||
UseMemoSize | 47 | uir | 255 | 11_0_0_0_1_0_47_0_0_0_255 | 0B00000001002F000000FF | 3.0 | |||||
WhereType | 48 | byte | 3 | 8_0_0_0_1_0_48_3 | 0800000001003003 | 3.0 | |||||
Prepared | 80 | bool | 0 | 8_0_0_0_1_0_80_0 | 0800000001005000 | 5.0 | |||||
CompareMemo | 81 | bool | 1 | 8_0_0_0_1_0_81_1 | 0800000001005110 | 5.0 | |||||
FetchAsNeeded | 82 | bool | 0 | 8_0_0_0_1_0_82_0 | 0800000001005200 | 5.0 | |||||
Offline | 83 | bool | 0 | 8_0_0_0_1_0_83_0 | 0800000001005300 | 5.0 | |||||
AllowSimultaneousFetch | 88 | bool | 0 | 8_0_0_0_1_0_88_0 | 0800000001005800 | 8.0 | |||||
Položka v pohledu | |||||||||||
(Zbylé vlastnosti jsou stejné jako u Položky) | |||||||||||
UpdateName | 35 | char | TaMesto.Pol1 | 20_0_0_0_1_0_35_TaMesto.Pol1_0 | 14000000010023TaMesto.Pol100 | 3.0 | |||||
KeyField | 38 | bool | 1 | 8_0_0_0_1_0_38_1 | 0800000001002601 | 3.0 | |||||
Updatable | 45 | bool | 1 | 8_0_0_0_1_0_45_1 | 0800000001002D01 | 3.0 | |||||
DataType | 77 | char | C(40) | 13_0_0_0_1_0_77_C(40)_0 | 0D00000001004DC(40)00 | 3.0 | |||||
77 | char | D | 9_0_0_0_1_0_77_D_0 | 0900000001004DD00 | 3.0 | ||||||
Neznámé vlastnosti | |||||||||||
TimeStamp | 76 | ???? | ???? | ???? | ???? | 3.0 | |||||
84 | ???? | ???? | ???? | ???? | 3.0 | ||||||
85 | ???? | ???? | ???? | ???? | 3.0 |
K dispozici je utilita pro načítání a ukládaná všech vlastností do DBC konteineru. Příklad použítí je hned na začátku.
Použitý materiál:
Doug Henning: SPECIAL REPORT - Visual FoxPro Data Dictionary,Pinnacle Publishing Inc.,Kent,1995, ISBN 1-880935-41-4