http://gitlab2.xugu.com/cyj/xugusql

1.连接:
     1.1 客户端主动发起连接,创建socket后,向服务端发出连接字符串: 
	login   database = '数据库名' user = '用户名'  password = '口令' [ encryptor = '加密库的解密口令' ]  
		[ char_set = '客户端使用的字符集名'] [ time_zone='时区']  [iso_level='事务隔离级别']
		[ lock_timeout='加锁超时' ] [ auto_commit='on或off']  [ strict_commit='on或off'] 
		[ result='char']   [ return_schema='on或off ] [ return_cursor_id='on或off ]
		[ lob_ret='descriptor']  [ return_rowid = true] version='客户端协议版本号'
		
	解释:	
		连接串中除了login database=数据库名 user = '用户名'  password = '口令' 外,其余为可选项,若未指定那些项,则系统为连接设置默认值
		
		数据解密口令:用于启动加密数据库,若库未加密,则可不要,但带上此参数不会影响连接
		
		客户端使用的字符集名: 'GB2312' ,'GBK','BIG5' 等,默认为GBK
		
		时区:	'GMT +08:00'
		
		事务隔离级别:
			'READ COMMITED':读已提交
			'REPEATIABLE READ':可重复读 
			'SERIALIZABLE':序列化
		
		加锁超时:
			毫秒数,表示本连接中的事务在争用锁时,最多等候的时间,若在此时间内加锁不成功,则回滚事务并报错
		
		auto_commit:
			on:表示自动提交,即每个命令都作为一个事务,命令完成立即提交
			off:非自动提交,需要 commit命令才提交
		
		strict_commit: 是否该连接中执行的事务使用严格提交(即须记实了事务日志才向客户端返回'K')
		
		result='char': 当设置了该项后,则float,integer等不以字串方式返回的结果皆强制使用字符串方式返回(此项对于odbc,jdbc等标准驱动皆不使用)
		
		return_schema: 是否在返回字段名信息时加上模式名,若设置为'on',则返回的字段名形式为: 模式名.表名.字段名 '%' 别名,否则返回的字段名形式为:表名.字段名 '%' 别名
		
		return_cursor_id: 若该项设置为'on',则存贮过程的ref_cursor的返回值为cursor的ID号,此时,客户端若要使用ref_currsor的结果,则应使用fetch命令,cursor的名为: 'CurN' + 游标号的16进制字串,
				若该项设置为off或没有该项,则将在返回结果中直接嵌入ref_cursor的结果集 
		
		lob_ret='descriptor': 该项目前服务器版本中没有,拟新加入,若有该项,则在返回大对象时不以数据形式返回,代之以描述符,当真正需要大对象数据时,使用 GET LOB 大对象描述符;命令从服务器取回数据
		
		version:
			客户端协议版本,目前都应是:'201'

 
    1.2 服务器端: 发回字节'K'表示成功,否则,发回错误信息(见错误信息格式)并立即关闭连接


2.所有DML及DDL访问:

    2.1 客户端发出访问: 
	
        QryStream:  '?'  Comand_Len   Comand_str   Param_num   { Param_name_len Param_name Param_INOUT Param_DType Param_Data_Len Param_Data }*
		?  5 ? STC 1 0 1   type_int 4 1
		
	解释:
		Command_len: 	命令长度(网络序32位整数,计算命令长度时不包括结束符0x0)
		Command_str: 	命令字串(发送时应包括结束符0x0)	  
		Param_num:	参数个数(网络序16位整数,若没有参数则此值为0)
		
		Param_name_len: 参数名字长度(网络序短整数,若参数无名,则此值为0)
		Param_name:	参数名(该部分字节数应与Param_name_Len一致)
		Param_INOUT: 参数输出输入类型(网络序16位整数)
		Param_DType:	参数数据类型号(网络序16位整数)
		Param_Data_Len:	参数长度(网络序32位整数)
		Param_Data:	参数数据(该部分字节数应与Param_Data_Len一致)
		
		{}*:		表示参数部分可有0至多个参数,其重复的次数取决于Param_num,若Param_num为0,则没有参数需要发送
 
 		

    2.2 服务器返回:  服务器可返回一组或多组信息,并以字节'K'标识所有信息已传送完毕
	
	SrvResponse:     { FormArgDescri | SelectResult | InsertResult | UpdateResult | DeleteResult | ProcRet | OutParamRet | ErrInfo | WarnInfo | Message }*  'K'
	
	FormArgDescri:   '$' Arg_Num { Arg_Name_Len Arg_Name Arg_No Arg_DType Arg_Preci_Scale }+ 
	
	SelectResult:    'A' Field_Num { Field_Name_Len Field_Name Field_DType Field_Preci_Scale Field_Flag }+  { 'R' Col_len1 Col_Data1 ... }*
	
	InsertResult:	 'I' Rowid_Len  Rowid_Data
	
	UpdateResult:	 'U' Update_Num	

	DeleteResult:	 'D' Delete_Num

	ProcRet:	 'O' Ret_DType  Ret_Data_Len  Ret_Data

	OutParamRet:	 'P' Out_Param_No   Out_Param_DType  Out_Param_Len  Out_Param_Data

	ErrInfo:	 'E' Err_Str_Len  Err_Str
	
	WarnInfo:	 'W' Warn_Str_Len Warn_Str

	Message:	 'M' Msg_Str_Len  Msg_Str


	解释:
		FormArgDescri:   形式参数描述,执行prepare语句后,通常返回此部分信息
		Arg_Num:	 形参个数(网络序32位整数)
		Arg_Name_Len:	 形参名长度(网络序32位整数)
		Arg_Name:	 形参名(字节数与Arg_Name_Len一致)
		Ar_No:		 形参的序号(网络序32位整数,若prepare语句中使用?号表示参数,则服务器按?号的顺序从1开始为其设定序号)
		Argg_DType:	 形参的数据类型ID(网络序32位整数)
		Arg_Preci_Scale: 形参的精度标度(网络序32位整数

		SelectResult:	 查询结果集,包含一组结果集字段描述 以及0至多个行数据
		Field_Num:	 结果集字段数
		Field_Name_Len:  字段名长度(网络序32位整数)
		Field_Name:	 字段名(字节数与Field_Name_Len一致)
		Field_DType:	 字段数据类型ID(网络序32位整数)
		Field_Preci_Scale:字段的精度标度(网络序32位整数,若为-1或0表示没有精度标度信息,否则高16位为精度低16位为标度)
		Field_Flag:	字段的其它属性标志(网络序32位整数),其中每一个位表征字段的某一个特性,各位对应的特性如下
				FIELD_BASE_TAB=1,	/* 表示字段是实际的表的字段(否则,表示字段实际上是表达式) */
				FIELD_NOT_NULL=2,	/* 表示字段具有非空约束 */
				FIELD_IS_PRIMARY=4, 	/* 表示字段是主键 */
				FIELD_IS_SERIAL=8,	/* 表示字段是序列值 */
				FIELD_IS_TIMESTAMP=16,	/* 表示字段是timestamp */
				FIELD_IS_LOB=32,	/* 表示字段是大对象类型 */
				FIELD_IS_UNIQUE=64,	/* 表示字段是唯一值类型 */
				FIELD_IS_ROWID=128,	/* 表示字段是rowid */
				FIELD_IS_DUMMY=256, 	/* 表示字段不应输出 */
				FIELD_IS_HIDE=512,	/* 表示字段是隐藏字段 */				 

		Col_len:	 列数据长度(网络序32位整数)
		Col_Data:	 列数据(字节数与Col_Len一致)
		
		注:  返回结果中,记录数据由 'R'开头,后跟若干个列的长度及数据,每个'R'后的列数据个数为Field_Num个		


		InsertResult:	插入语句的返回结果
		Rowid_Len:	插入语句返回的新行的ROWID数据的长度
		Rowid_Data:	插入语句返回的新行的ROWID数据(为base64编码)


		UpdateResult:	更改语句返回的结果
		Update_Num:	更改语句影响的行数(网络序32位整数)
		
		DeleteResult:	删除语句的返回结果
		Delete_Num:	删除的行数
		
		ProcRet:	存贮函数调用的返回值
		Ret_DType:	返回值数据类型(网络序32位整数)
		Ret_Data_Len:	返回值数据长度(网络序32位整数)
		Ret_Data:	返回值数据	

		OutParamRet:	返回型参数
		Out_Param_No:	返回型参数的参数号
		Out_Param_DType:返回参数的数据类型(网络序32位整数)
		Out_Param_Len:	返回参数的数据长度(网络序32位整数)
		Out_Param_Date:	返回参数的数据	

		ErrInfo:	错误信息(通常在返回数据的最后出现,即出现在 'K'字符前)
		Err_Str_Len:	错误信息长度(网络序32位整数)
		Err_Str:	错误信息(字节数与Err_Str_Len一致)
	
		WarnInfo:	警告信息(通常在返回数据的最后出现,即出现在 'K'字符前)
		Warn_Str_Len:	警告信息长度(网络序32位整数)
		Warn_Str:	警告信息(字节数与Warn_Str_Len一致)

		Message:	通知信息(出现的位置没有一定的规定)
		Msg_Str_Len:	通知信息长度(网络序32位整数)
		Msg_Str:	通知信息(字节数与Msg_Str_Len一致)

		注: {}* 中各种返回信息是并列的关系,可能一次返回中含有0个至多个返回信息,不能假定改到其中其种返回信息就认为没有其它种类的返回信息,
			有些类型的返回信息甚至可能重重出现,如:一次发多条select 语句就会造成返回信息中包含多个查询结果集.

	2.3 关于新版本中将增加的大对象数据返回形式的说明
		
		a) 当在连接中未加入了 lob_ret='descriptor'子串时,使用原来的方式返回大对象数据

		b) 当在连接中加入了 lob_ret='descriptor'子串时,应该将大对象对应的列返回值视作描述符,描述符分两种:一种为内嵌在行内的大对象数据的描述符,一种为非内嵌大对象描述符
			内嵌大对象描述符:   
				BLOB类型：'b' + 大对象数据  即:大对象数据仍直接返回,只是前面加了一个 'b'字符,因此大对象数据的长度实际为列数据长度-1
				CLOB类型：'c' + 大对象数据  即:大对象数据仍直接返回,只是前面加了一个 'c'字符,因此大对象数据的长度实际为列数据长度-1

			非内嵌大对象描述符:
				BLOB类型： 'B' + 大对象描述符字串 ,该字符串由两部分组成：前面为descriptor的base64编码，后面为大对象的数据长度（10进制数值串），
					   中间由空格分开；整个串的长度为列数据长度-1；
				CLOB类型： 'C' + 大对象描述符字串，其余与BLOB相同 
		
		c) 当大对象字段返回的字段长度为0时,仍表示该字段为空值,不能再去取该字段的数据作为描述符用

		d) 对于内嵌大对象,驱动应保存其数据,而不能从服务器另取数据

		e) 对于非内嵌大对象,驱动在向应用程序返回数据时使用: 
			GET LOB '大对象描述符' offset 偏移量 limit 读取长度; 命令来读取大对象数据. (注意:大对象描述符串包括前面的‘B’或‘C’，
				但不包含后面的大对象长度字串，描述前后有'号)  
			服务端以单行单列结果集的形式返回数据：
				对于BLOB，返回的字段名为：BLOBDATA,返回记录的数据长度为实际读取长度（通常就是limit，若已读到尾，则小于limit)，
				对于CLOB，返回的字段名为：CLOBDATA,若不存在库字符集与客户端字符集的差异，则返回记录的数据长度为实际读取长度，
				否则，返回的数据长度为字符集转换后的长度，当然，内容也就为转换后的内容。

				
	
3.数据类型ID的取值:以下取值未写明数值的按有数值的依次向下增1
	
	TYPE_EMPTY = 0,
	TYPE_NULL,
	TYPE_BOOL,
	TYPE_I1,
	TYPE_UI1,
	TYPE_I2,
	TYPE_UI2,
	TYPE_I4,
	TYPE_UI4,
	TYPE_I8,
	TYPE_UI8,
	TYPE_R4,
	TYPE_R8,
	TYPE_DATE,
	TYPE_TIME,
	TYPE_DATETIME,
	TYPE_TIMESTAMP,
	TYPE_INTERVAL_D2S,
	TYPE_SMALLTIME,
	TYPE_TIME_TZ,
	TYPE_DATETIME_TZ,
	TYPE_INTERVAL_Y2M,

	TYPE_DECIMAL,
	TYPE_NUMERIC,
	TYPE_CY, 
	TYPE_STR,
	TYPE_CHAR,
	TYPE_VARCHAR,
	TYPE_CLOB,
	TYPE_BINARY,
	TYPE_BLOB,
	TYPE_IMAGE,
	TYPE_BLOB_INROW,
	TYPE_BLOB_S,
	TYPE_BLOB_M,
	TYPE_BLOB_OM,
	TYPE_STREAM,
	TYPE_AUDIO,
	TYPE_VIDEO,
	TYPE_ROWVER,

	TYPE_INTERVAL_Y,
	TYPE_INTERVAL_M,
	TYPE_INTERVAL_D,
	TYPE_INTERVAL_H,
	TYPE_INTERVAL_MI,
	TYPE_INTERVAL_S,
	TYPE_INTERVAL_D2H,
	TYPE_INTERVAL_D2M,
	TYPE_INTERVAL_H2M,
	TYPE_INTERVAL_H2S,
	TYPE_INTERVAL_M2S,
	TYPE_GUID,

	TYPE_GEOMETRY=60,
	TYPE_POINT,
	TYPE_BOX,
	TYPE_POLYLINE,
	TYPE_POLYGON,
	

	TYPE_MAX_SYS=100,

	TYPE_BLADE_BEGIN=101,
	TYPE_BLADE_END=1000,
	
	TYPE_OBJECT=1001,		/* 对象类型 */
	TYPE_RECORD,			/* 记录类型 */
	TYPE_VARRAY,			/* 数组类型 */
	TYPE_TABLE,			/* 表类型 */
	TYPE_IDXBY_TAB,			/* index by 表类型 */
	TYPE_ROWTYPE,			/* 引用行类型 */
	TYPE_COLTYPE,			/* 引用列类型 */
	TYPE_ROW,			/* 行类型  */
	TYPE_CUR_REC,			/* 引用记录类型(不能更改字段) */
	TYPE_CURSOR,			/* 游标类型 */
	TYPE_REFCUR,			/* REF_CURSOR类型 */
	TYPE_PARAM,

	TYPE_UDT_BEGIN=1100,	


4.数据类型返回格式
	2.1.若连接时连接串中有 result='char'，则各类型数据的返回值皆转换成字符串的形式进行返回，
	    
	    	数值型（integer,float,numeric等）,返回的字符串变由数字与小数点组成
	    	日期型格式：‘2011-3-3’
		时间型格式 ‘12:03:40’或 ‘12:03:40.999'
		日期时间型格式:‘2011-3-3 12:34:23' 或 ‘2011-3-3 12:34:23.999'
		带时区的日期时间格式：‘2011-3-3 12:34:23+08:00' 或‘2011-3-3 12:34:23-08:00'
		带时区的时间格式：‘12:34:23+08:00' 或‘12:34:23-08:00'

	2.2若连接串中不含 result='char'，则各类型数据的返回值通常以二进制方式返回
		
		char、varchar、clob、numeric等类型以字符串形式返回
		数值型(integer等除numeric外)返回格式，就是其二进制格式，只是转换成了网络序
		date: 32位网络序整数，为从1970-1-1起流失的天数(负数表示在1970-1-1之前）
		time: 32位网络序整数，为一天内从0:0:0开始流失的毫秒数
		datetime:64位网络序整数，为从1970-1-1起流失的毫秒数(负数表示在1970-1-1之前）
		time with time zone:6字节，前4字节为32位网络序时间值，后2字节为16位网络序时区值，时间值与time的处理方式一样，
			时区值为时区相对于格林威治天文台的时差，单位为分钟，有正负之分。
		datetime with time zone:10字节，前8字节为64位网络序日期时间值，后2字节为16位网络序时区值，日期时间值与datetime的处理方式一样，
			时区值为时区相对于格林威治天文台的时差，单位为分钟，有正负之分。

		interval year:	32位网络序整数，单位为年
		interval month:	32位网络序整数，单位为月
		interval day:	32位网络序整数，单位为天

		interval hour:	32位网络序整数，单位为小时
		interval minute:32位网络序整数，单位为分钟
		interval second:64位网络序整数，单位为毫秒（微秒  CYJ）

		注：interval XX to YY（如interval day to second)其返回的值的格式与 interval YY相同，
		即：interval day to second 返回格式与interval second相同，余类推
		
