c语言进阶-利用c语言解构oracle底层数据(不开库)-基础类型定义

c语言进阶-利用c语言解构oracle底层数据(不开库)-基础类型定义_第1张图片

 应当随时学习,学习一切;应当集中全力,以求知道得更多,知道一切。——高尔基

    说c语言是最高效的高级编程语言,我相信大家都不会反对。学习c语言,可以让我们更加了解计算机的底层运行原理,更加了解上层的其他程序的实现原理。下面我将利用c语言结构oracle数据库的块构成原理,了解oracle内部原理的同时,提升自己c语言编程能力。本文将介绍oracle(11g为例)的基础类型定义。

一,基础类型typedeff

//
// Created by root on 22-9-9.
//

#ifndef TEXAMPLE_OTYPE_H
#define TEXAMPLE_OTYPE_H


typedef unsigned char ub1;
typedef   signed char sb1;
typedef          char eb1;

//#define UB1MAXVAL    ((ub1)UCHAR_MAX)
//#define UB1MINVAL    ((ub1)       0)
//#define SB1MAXVAL    ((sb1)SCHAR_MAX)
//#define SB1MINVAL    ((sb1)SCHAR_MIN)
//
//#define MINUB1MAXVAL ((ub1)  255)
//#define MAXUB1MINVAL ((ub1)    0)
//#define MINSB1MAXVAL ((sb1)  127)
//#define MAXSB1MINVAL ((sb1) -127)
//
//#define EB1MAXVAL    ((eb1)SCHAR_MAX)
//#define EB1MINVAL    ((eb1)        0)
//
//#define MINEB1MAXVAL ((eb1)  127)
//#define MAXEB1MINVAL ((eb1)    0)
//
//#define UB1BITS      CHAR_BIT
//#define UB1MASK      ((1 << ((uword)CHAR_BIT)) - 1)


typedef sb1 b1;


//#define B1MAXVAL SB1MAXVAL
//#define B1MINVAL SB1MINVAL


typedef unsigned short ub2;
typedef   signed short sb2;
typedef          short eb2;


typedef sb2 b2;


typedef unsigned int ub4;
typedef   signed int sb4;
typedef          int eb4;



typedef sb4 b4;



typedef unsigned int uword;
typedef   signed int sword;
typedef          int eword;


typedef unsigned long ubig_ora;
typedef   signed long sbig_ora;








#endif //TEXAMPLE_OCONFIG_H

二,结构类型声明

    块头结构声明

struct kcbh{
    ub1 type_kcbh;
    ub1 frmt_kcbh;
    ub1 spare1_kcbh;
    ub1 spare2_kcbh;
    ub4 rdba_kcbh;
    ub4 bas_kcbh;
    ub2 wrp_kcbh;
    ub1 seq_kcbh;
    ub1 flg_kcbh;
    ub2 chkval_kcbh;
    ub2 spare3_kcbh;
};

    段头块事务和区信息结构声明

struct locker_ktech{
    ub2 kxidusn;
    ub2 kxidslt;
    ub4 kxidsqn;
    ub4 flag_ktech;
};
struct hwmark_ktech{
    ub4 extno_ktehw;
    ub4 blkno_ktehw;
    ub4 extsize_ktehw;
    ub4 blkaddr_ktehw;
    ub4 mapblk_ktehw;
    ub4 offset_ktehw;
    ub4 flblks_ktehw;
    ub4 blkcnt_ktehw;
};
struct ktech{
    ub4 spare1_ktech;
    sword tsn_ktech;
    ub4 lastmap_ktech;
    ub4 mapcount_ktech;
    ub4 extents_ktech;
    ub4 blocks_ktech;
    ub2 mapend_ktech;
    struct hwmark_ktech hwmark_ktech1;
    struct locker_ktech locker_ktech1;
};

struct ktemh{
    ub4 count_ktemh;
    ub4 next_ktemh;
    ub4 obj_ktemh;
    ub4 flag_ktemh;
};


struct ktetb{
    ub4 ktetbdba;
    ub4 ktetbnbk;
};

struct ktshc{
    ub2 ktshcnxf;
    ub2 ktshcnfl;
    ub2 ktshcnfb;
    ub1 ktshctyp;

};

struct ktsfsxid{
    ub2 kxidusn;
    ub2 kxidslt;
    ub4 kxidsqn;

};


struct ktsfs_seg{
    ub2 ktsfsflg;
    struct ktsfsxid ktsfsxid1;
    ub4 ktsfslhd;
    ub4 ktsfsltl;
};

struct ktsfs_txn{
    ub2 ktsfsflg;
    struct ktsfsxid ktsfsxid1;
    ub4 ktsfslhd;
    ub4 ktsfsltl;
};

    簇/数据块事务和数据信息结构声明

struct ktbitxid{
    ub2 kxidusn;
    ub2 kxidslt;
    ub4 kxidsqn;
};
struct ktbituba{
    ub4 kubadba;
    ub2 kubaseq;
    ub1 kubarec;
};



struct ktbbhitl{
    struct ktbitxid ktbitxid1;
    struct ktbituba ktbituba1;
    ub2 ktbitflg;
    union _ktbitun{
        sb2 _ktbitfsc;
        ub2 _ktbitwrp;
    } ktbitun;
    ub4 ktbitbas;
};

struct ktbbhcsc{
    ub4 kscnbas;
    ub2 kscnwrp;
};





struct ktbbh{    //Transaction Fixed Header structure
    ub1 ktbbhtyp;
    union ktbbhsid{
        ub4 ktbbhsg1;
        ub4 ktbbhod1;
    }ktbbhsid1;
    struct ktbbhcsc ktbbhcsc1;
    sb2 ktbbhict;
    ub1 ktbbhflg;
    ub1 ktbbhfsl;
    ub4 ktbbhfnx;
    struct ktbbhitl ktbbhitl1;
    struct ktbbhitl ktbbhitl2;
};





struct kdbh{
    ub1 kdbhflag;
    sb1 kdbhntab;
    sb2 kdbhnrow;
    sb2 kdbhfrre;
    sb2 kdbhfsbo;
    sb2 kdbhfseo;
    sb2 kdbhavsp;
    sb2 kdbhtosp;
};


struct kdbt{
    sb2 kdbtoffs;
    sb2 kdbtnrow;
};



struct kdrid{
    ub4 dba;
    ub2 oid;
};


struct kdbrdh{
    ub1 flag;
    ub1 lock;
    ub1 cols;
    ub2 kref;
    ub2 mref;
    struct kdrid hrid;
    struct kdrid nrid;
};

struct kdtrh{
    ub1 flag;
    ub1 lock;
    ub1 cols;
    ub1 clki;
};

二,说明

        结构体kcbh占用20个字节,用来存储数据块的头信息:数据块类型(例如undo块,数据块,索引块等),scn,dba等;

        每个表对应一个数据段,段由区组成,段头信息中存储了段所有区的分布信息。通过读取段头,我们可以抓取到表所有的区数据(也就是数据块的信息)。结构ktech和ktemh可以获取区的统计信息;结构ktetb可以知道每个区的具体位置和大小。

        簇/数据块中,簇数据块中,结构ktemh是紧邻结构ktech的,偏移量为92;堆数据块中,结构ktemh是与结构ktech有8字节的偏移量,其总偏移量为100。结构体kdbh中记录:块中表的个数,块中记录行数等信息;结构体kdbt记录表的编号和行数;

三,其他

        oracle块有很多类型,我们只针对簇/数据块进行读取,先抓取oracle的数据字典表,根据字典表,可以获取到数据库中其他表的基本信息:表名,表字段个数,表字段名,表字段类型等信息。

你可能感兴趣的:(Oracle,C/C++,oracle,c语言,数据库)