在学习安全传输平台项目总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。

10-安全传输平台项目-第07天(密钥协商设计与实现--数据库操作)

目录:
一、复习
二、安全传输平台项目——密钥协商设计与实现--数据库操作
1、数据库-启动回顾
2、数据库-SQL语句回顾
3、数据库-事务回顾
4、数据库-显示中文问题
5、数据库-函数接口设计
6、游标说明
7、数据库-proc说明
8、数据库-访问API
9、数据库-非查询语句API使用
10、数据库-错误调试
11、数据库-查询语句API
12、数据库-行存储内存模型打造
13、数据库-操作接口
14、数据库-base64编码和函数注意事项

 

一、复习

1、密钥协商共享内存
2、守护进程
3、脚本

 

二、安全传输平台项目——密钥协商设计与实现--数据库操作

1、数据库-启动回顾

》数据启动:
    1. su - oracle (不允许使用root 启动 oracle 数据库)
    2. sqlplus /nolog
    3. connect / as sysdba
    4. startup
    5. show suer; (select * from scott.dept)    quit;
    6. 在命令行中 lsnrctl start

注意:如果未启动lsnrctl start,无法在外部借助第三方工具(如:SQL Developer)访问数据库。

 

2、数据库-SQL语句回顾

》SQL语句:

    查询:
        select * from 表 where 条件。
        select deptno, dname, loc from dept where deptno = 20;

    删除:
        delete from 表 where 条件。
        delete from dept where deptno = 99;

   插入:
        insert into 表(deptno, dname) values(50, 'Engineer') ;
        insert into dept values(60, 'Engineer', 'Beijing');

    更新:
        update 表 set 列名=列新值 [,列名=列新值] where 条件。
        update dept set dname='Engineer', loc = 'Beijing' where deptno=60;

 

3、数据库-事务回顾

》事务:
    要么都成功、要么都失败。
    4大特性:持久性、隔离性、原子性、一致性。

    DCL:commit; rollback; savepoint;
    DDL:create; truncate; grant; alter; revoke;
    DML:insert/update/delete/select  --- curd

    开启:
        oracle 默认自动开启事务。    ---mySQL 可以设置手动开启。   

    关闭:
        显式关闭:
            commit; rollback;
        隐式关闭:
            quit;执行DDL语句时
        异常:宕机、掉电。。。 --- rollback;

 

4、数据库-显示中文问题

一般需要查看

1)echo $LANG

2)cat /etc/sysconfig/i18n

3)vi .bash_profile

安全传输平台项目——密钥协商设计与实现--数据库操作

注释掉(或者改为NLS_LANG = UTF-8)保存退出后,执行>source .bash_profile 生效。

注意:如果只在test04用户下更改.bash_profile,切换到oracle用户后查看表中数据仍然中文乱码!

4)如果都解决不了,只能重启数据库!


扩:字符集的问题?NLS_LANG后的字符集要与数据库的默认的字符集对应,否则可能会乱码

NLS_CHARACTERSET表示字符集,NLS_NCHAR_CHARACTERSET表示国家字符集
》数据库的字符集(props$):
set linesize 300
set pagesize 300
select * from nls_database_parameters;

select userenv('language') from dual;

》客户端字符集(v$parameter)
select * from nls_instance_parameters;

》会话字符集(v$nls_parameters)
select * from nls_session_parameters;
安全传输平台项目——密钥协商设计与实现--数据库操作
》查看linux服务器字符集
echo $LANG
env |grep LANG

》设置LANG
查看LANG    env | grep LANG
设置LANG    export LANG=zh_CH.GBK

LANG是针对Linux系统的语言、地区、字符集的设置。
NLS_LANG是针对Oracle语言、地区、字符集的设置。

在使用zhs16gbk时SourceCRT会话设置字符集为 gb18030


 

5、数据库-函数接口设计

》问题抛出:如何在单位时间内提高客户端与服务器的通信效率?

服务器(epoll、select、多路I/O转接、线程池、libevent库等)优化的再好,只能当前服务器并发事件的处理的能力,也要考虑客户端(扩大通信带宽(如:用户级缓冲区的大小)、socket通信(提高连接数,如:连接池))

》客户端数据库连接池:

安全传输平台项目——密钥协商设计与实现--数据库操作

    所有的数据库访问操作,都是典型的 C/S ---- socket
    int clitPool_init(int num, char *dbuser, char *dbpasswd, char *dbname, void **handle);
    int clitPool_GetConn(void *handle);

无结果集:
    int clitPool_NoResutl(void *handle, char *sql);

    int clitPool_StartTrans(void *handle);

结果集:
    int clitPool_HaveResutl(void *handle, char *sql, void **outResult);

    游标: (不知道返回的结果集-表 的长度为多少,所以使用游标
        while (1) {
            fatch 数据(当调用游标fatch时,取出一行结果集的同时,游标往下移动一行
        }
    int clitPool_createCursor(void *handle, char *sql, void **cursor);
    int clitPool_openCursor(void *cursor, void **outResult);
    int clitPool_fetchData(void *cursor, void *Row); --> while 中
    int clitPool_closeCursor(void *cursor);   
  int clitPool_CommitTrans(void *handle);
  int clitPool_RollbackTrans(void *handle);
  int clitPool_PutConn(void *handle);
  int clitPool_destroy(void *handle);

 

6、游标说明

普通游标  滚动游标   两种。
      获取第一行
      获取最后一行
      获取相对第N行  
      获取绝对第N行

》游标使用一般步骤:

    1. 创建一个游标        --- 游标一定是为某一次查询而生的。( select语句 )

    2. 打开游标        --- 当游标成功打开,(1)标志着结果集已经存储至客户端本地。
                                        (2)标志着游标已经指向结果集中的首行

    3. fetch 提取数据    --- 一次fetch 只能提取一行数据。 一定要结合 while 循环。 找结束点  Oracle1403 、MySQL100

    4. 关闭游标。

 

7、数据库-proc说明

icdbapi.h对应lib下的libicdbapi.so(以及内部使用的libclntsh.so)

》proc:

安全传输平台项目——密钥协商设计与实现--数据库操作

 

8、数据库-访问API

>vi icdbapi.h

#ifndef _IC_DBApi_H_
#define _IC_DBApi_H_


#ifdef  __cplusplus
extern "C" {
#endif


#ifndef ICDBHandle
#define ICDBHandle            void*
#endif

#ifndef ICDBCursor
#define ICDBCursor            void*
#endif

#ifndef ICDBLob
#define ICDBLob                void*
#endif


#define ICDBBLOB            0
#define ICDBCLOB            1
#define ICDBNCLOB            2

#define MAXBLOBDATALEN        1024


#ifndef ICDBField
typedef struct _ICDBField
{
    char*    cont;
    int        contLen;
}ICDBField;
#endif

#ifndef ICDBRow
typedef struct _ICDBRow
{
    ICDBField*    field;
    int            fieldCount;
}ICDBRow;
#endif


/*实际使用的Level(如果[1]=0或1(debug),[2]=0或2(info),[3]=0或3(warning),[4]=0或4(error)),为0则表示不写相应的日志*/
//extern int  IC_DB_DTUseLevel[5];
extern int  DTORADBLevel[5];


/********************************************************/
/*程 序 名:    IC_DBApi_PoolInit                        */
/*功能描述:    数据库连接池初始化                        */
/*参数说明:    bounds        连接池容量                    */
/*                dbName        数据库名称                    */
/*                dbUser        数据库用户                    */
/*                dbPswd        数据库用户口令                */
/********************************************************/
int IC_DBApi_PoolInit(int bounds, char* dbName, char* dbUser, char* dbPswd);


// SECMNG/SCEMNG@orcl

/********************************************************/
/*程 序 名:    IC_DBApi_ConnGet                        */
/*功能描述:    从连接池获取数据库连接                    */
/*参数说明:    handle        数据库连接句柄                */
/*                sTimeout    超时时间(秒)                */
/*                nsTimeout    超时时间(毫秒)                */
/********************************************************/
int IC_DBApi_ConnGet(ICDBHandle* handle, int sTimeout, int nsTimeout);


/********************************************************/
/*程 序 名:    IC_DBApi_ConnFree    实际对应ConnPut        */
/*功能描述:    释放数据库连接到连接池                    */
/*参数说明:    handle        数据库连接句柄                */
/*                validFlag    数据库连接有效性        1    */
/********************************************************/
int IC_DBApi_ConnFree(ICDBHandle handle, int validFlag);


/********************************************************/
/*程 序 名:    IC_DBApi_PoolFree                        */
/*功能描述:    释放数据库连接池                        */
/*参数说明:                                            */
/********************************************************/
int IC_DBApi_PoolFree();


/********************************************************/
/*程 序 名:    IC_DBApi_ExecNSelSql                    */
/*功能描述:    执行单个非select数据库语句(不包含事务)    */
/*参数说明:    handle        数据库连接句柄                */
/*                sql            数据库语句                    */
/********************************************************/
int IC_DBApi_ExecNSelSql(ICDBHandle handle, char* sql);


/********************************************************/
/*程 序 名:    IC_DBApi_ExecNSelSqls                    */
/*功能描述:    执行多个非select数据库语句(包含事务)    */
/*参数说明:    handle        数据库连接句柄                */
/*                sqls        数据库语句(以NULL结束)        */
/********************************************************/
int IC_DBApi_ExecNSelSqls(ICDBHandle handle, char* sqls[]);


/********************************************************/
/*程 序 名:    IC_DBApi_BeginTran                     */
/*功能描述:    数据库事务开始                          */
/*参数说明:    handle      数据库连接句柄              */
/********************************************************/
int IC_DBApi_BeginTran(ICDBHandle handle);


/********************************************************/
/*程 序 名:    IC_DBApi_Rollback                        */
/*功能描述:    数据库事务回退                            */
/*参数说明:    handle        数据库连接句柄                */
/********************************************************/
int IC_DBApi_Rollback(ICDBHandle handle);


/********************************************************/
/*程 序 名:    IC_DBApi_Commit                        */
/*功能描述:    数据库事务提交                            */
/*参数说明:    handle        数据库连接句柄                */
/********************************************************/
int IC_DBApi_Commit(ICDBHandle handle);


/********************************************************/
/*程 序 名:    IC_DBApi_ExecSelSql                    */
/*功能描述:    执行select数据库语句(返回单条记录)        */
/*参数说明:    handle        数据库连接句柄                */
/*                sql            数据库语句                    */
/*                row            返回的记录                    */
/********************************************************/
int IC_DBApi_ExecSelSql(ICDBHandle handle, char* sql, ICDBRow* row);


/********************************************************/
/*程 序 名:    IC_DBApi_ExecSelSqlMR                  */
/*功能描述:    执行select数据库语句(返回多条记录)      */
/*参数说明:    handle      数据库连接句柄              */
/*              sql         数据库语句                  */
/*              beginNo     返回记录的开始条数          */
/*              count       返回记录的条数              */
/*                rows        返回的记录                    */
/*              allRecNum   符合条件的记录总数          */
/********************************************************/
int IC_DBApi_ExecSelSqlMR(ICDBHandle handle, char* sql, int beginNo, int count, ICDBRow* rows, int* allRecNum);


/********************************************************/
/*程 序 名:    IC_DBApi_OpenCursor                    */
/*功能描述:    打开游标                                */
/*参数说明:    handle      数据库连接句柄              */
/*              sql         数据库语句                  */
/*              fieldCount  字段个数                    */
/*              pCursor     游标指针                    */
/********************************************************/
int IC_DBApi_OpenCursor(ICDBHandle handle, char* sql, int fieldCount, ICDBCursor* pCursor);


/********************************************************/
/*程 序 名:    IC_DBApi_FetchByCursor                 */
/*功能描述:    通过游标获取数据                        */
/*参数说明:    handle      数据库连接句柄              */
/*              cursor      游标                           */
/*                row            返回的记录                    */
/********************************************************/
int IC_DBApi_FetchByCursor(ICDBHandle handle, ICDBCursor cursor, ICDBRow* row);


/********************************************************/
/*程 序 名:    IC_DBApi_CloseCursor                   */
/*功能描述:    关闭游标                                */
/*参数说明:    handle      数据库连接句柄              */
/*              pCursor     游标指针                    */
/********************************************************/
int IC_DBApi_CloseCursor(ICDBHandle handle, ICDBCursor* pCursor);

/********************************************************/
/*程 序 名:    IC_DBApi_Pem2Der                        */
/*功能描述:    PEM编码转DER编码                        */
/*参数说明:    pemData     PEM数据                      */
/*              pemDataLen  PEM数据长度                    */
/*              derData     DER数据                        */
/*              derDataLen  DER数据长度                    */
/********************************************************/
int IC_DBApi_Pem2Der(char* pemData, int pemDataLen, unsigned char* derData, int* derDataLen);


/********************************************************/
/*程 序 名:    IC_DBApi_Der2Pem                        */
/*功能描述:    PEM编码转DER编码                        */
/*参数说明:    derData     DER数据                      */
/*              derDataLen  DER数据长度                    */
/*              pemData     PEM数据                        */
/*              pemDataLen  PEM数据长度                    */
/********************************************************/
int IC_DBApi_Der2Pem(unsigned char* derData, int derDataLen, char* pemData, int* pemDataLen);


/********************************************************/
/*程 序 名:    IC_DBApi_GetDBTime                        */
/*功能描述:    获取数据库时间                            */
/*参数说明:    handle      数据库连接句柄              */
/*              dbTime       数据库时间                     */
/********************************************************/
int IC_DBApi_GetDBTime(ICDBHandle handle, char* dbTime);



#define IC_DB_BASE_ERR                        17000

#define IC_DB_OK                            0
#define IC_DB_NODATA_AFFECT                    100

#define IC_DB_PARAM_ERR                        IC_DB_BASE_ERR+1    //SQLDA初始化错误
#define IC_DB_SQLDAINIT_ERR                    IC_DB_BASE_ERR+1    //SQLDA初始化错误
#define IC_DB_SQLRELEASE_ERR                IC_DB_BASE_ERR+2    //提交事务并释放连接语句错误
#define IC_DB_SQLALTERDATE_ERR                IC_DB_BASE_ERR+3    //修改连接的时间格式语句错误
#define IC_DB_SQLCONNECT_ERR                IC_DB_BASE_ERR+4    //连接数据库语句错误
#define IC_DB_PTHREAD_MUTEX_INIT_ERR        IC_DB_BASE_ERR+5    //初始化互斥错误
#define IC_DB_PTHREAD_COND_INIT_ERR            IC_DB_BASE_ERR+6    //初始化条件错误
#define IC_DB_SQLENABLETHREADS_ERR            IC_DB_BASE_ERR+7    //设置使用线程语句错误
#define IC_DB_MALLOC_ERR                    IC_DB_BASE_ERR+8    //分配内存错误
#define IC_DB_CONTEXTALLOCATE_ERR            IC_DB_BASE_ERR+9    //为连接句柄分配内存语句错误
#define IC_DB_CONNECT_ERR                    IC_DB_BASE_ERR+10    //数据库连接错误
#define IC_DB_PTHREAD_MUTEX_LOCK_ERR        IC_DB_BASE_ERR+11    //获取互斥锁错误
#define IC_DB_ALLCONN_NOTVALID_ERR            IC_DB_BASE_ERR+12    //连接池所有连接都是无效连接错误
#define IC_DB_CONDTIMEOUT_ERR                IC_DB_BASE_ERR+13    //获取连接超时错误
#define IC_DB_PTHREAD_COND_TIMEDWAIT_ERR    IC_DB_BASE_ERR+14    //线程条件超时等待函数错误
#define IC_DB_POOLTERMINATED_ERR            IC_DB_BASE_ERR+15    //连接池已经终止错误
#define IC_DB_GETCOND_VALIDISZERO_ERR        IC_DB_BASE_ERR+16    //获取条件后有效连接仍未0错误
#define IC_DB_PTHREAD_MUTEX_UNLOCK_ERR        IC_DB_BASE_ERR+17    //释放互斥锁错误
#define IC_DB_VALIDBOUNDS_ERR                IC_DB_BASE_ERR+18    //有效连接数大于最大容量错误
#define IC_DB_NVALIDBOUNDS_ERR                IC_DB_BASE_ERR+19    //无效连接数大于最大容量错误
#define IC_DB_POOL_WAKEALL_ERR                IC_DB_BASE_ERR+20    //唤醒所有连接的阻塞状态错误
#define IC_DB_SQLEXECIMMEDIAT_ERR            IC_DB_BASE_ERR+21    //立即执行SQL语句错误
#define IC_DB_COMMIT_ERR                    IC_DB_BASE_ERR+22    //事务提交语句错误
#define IC_DB_ROLLBACK_ERR                    IC_DB_BASE_ERR+23    //事务回退语句错误
#define IC_DB_PREPARESTMT_ERR                IC_DB_BASE_ERR+24    //准备查询语句错误
#define IC_DB_DESCRIBESELECT_ERR            IC_DB_BASE_ERR+25    //填充SQLDA语句错误
#define IC_DB_FIELDCOUNT_ERR                IC_DB_BASE_ERR+26    //输入的字段数目错误
#define IC_DB_FIELDNULL_ERR                    IC_DB_BASE_ERR+27    //输入的字段为空错误
#define IC_DB_SETROWDATAMEMORY_ERR            IC_DB_BASE_ERR+28    //为字段设置存贮空间错误
#define IC_DB_DECLARECURSOR_ERR                IC_DB_BASE_ERR+29    //定义游标语句错误
#define IC_DB_OPENCURSOR_ERR                IC_DB_BASE_ERR+30    //打开游标语句错误
#define IC_DB_FETCH_ERR                        IC_DB_BASE_ERR+31    //通过游标获取数据语句错误
#define IC_DB_CLOSECURSOR_ERR                IC_DB_BASE_ERR+32    //关闭游标语句错误
#define IC_DB_INPUT_ERR                        IC_DB_BASE_ERR+33    //输入条件错误
#define IC_DB_GETROWCOUNT_ERR                IC_DB_BASE_ERR+34    //获取符合条件的记录总数错误
#define IC_DB_LOBDESCRIBE_ERR                IC_DB_BASE_ERR+35    //获取原有LOB数据属性语句错误
#define IC_DB_LOBWRITE_ERR                    IC_DB_BASE_ERR+36    //往LOB字段写数据语句错误
#define IC_DB_ALLOCATELOB_ERR                IC_DB_BASE_ERR+37    //分配BLOB语句错误
#define IC_DB_LOBREAD_ERR                    IC_DB_BASE_ERR+38    //从LOB字段读数据语句错误
#define IC_DB_LOBFREE_ERR                    IC_DB_BASE_ERR+39    //释放LOB语句错误
#define IC_DB_LOBCLOSE_ERR                    IC_DB_BASE_ERR+40    //关闭LOB语句错误
#define IC_DB_LOBNOTOPEN_ERR                IC_DB_BASE_ERR+41    //Lob没有打开错误
#define IC_DB_LOBOPEN_ERR                    IC_DB_BASE_ERR+42    //打开LOB错误
#define IC_DB_SQLEXECBEGINWORK_ERR            IC_DB_BASE_ERR+43    //开始事务错误
#define IC_DB_SQLGETTIME_ERR                IC_DB_BASE_ERR+44    //获取数据库时间错误

/*#define                 IC_DB_BASE_ERR+        //错误
#define                 IC_DB_BASE_ERR+45    //错误
#define                 IC_DB_BASE_ERR+46    //错误
#define                 IC_DB_BASE_ERR+47    //错误
#define                 IC_DB_BASE_ERR+48    //错误
#define                 IC_DB_BASE_ERR+49    //错误*/

#define IC_DB_CONNECTION_ERR                -3113                    //与数据库的连接错误
#define IC_DB_CONNECTION2_ERR                -3114                    //与数据库的连接错误


#ifdef __cplusplus
}
#endif


#endif
icdbapi.h

相关文章:

  • 2021-12-19
  • 2021-09-11
  • 2021-11-15
  • 2021-07-03
  • 2021-09-06
  • 2021-12-09
  • 2021-10-21
猜你喜欢
  • 2021-11-25
  • 2021-12-16
  • 2021-10-10
  • 2022-02-27
  • 2021-12-14
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案