协议.ini 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. http://gitlab2.xugu.com/cyj/xugusql
  2. 1.连接:
  3. 1.1 客户端主动发起连接,创建socket后,向服务端发出连接字符串:
  4. login database = '数据库名' user = '用户名' password = '口令' [ encryptor = '加密库的解密口令' ]
  5. [ char_set = '客户端使用的字符集名'] [ time_zone='时区'] [iso_level='事务隔离级别']
  6. [ lock_timeout='加锁超时' ] [ auto_commit='on或off'] [ strict_commit='on或off']
  7. [ result='char'] [ return_schema='on或off ] [ return_cursor_id='on或off ]
  8. [ lob_ret='descriptor'] [ return_rowid = true] version='客户端协议版本号'
  9. 解释:
  10. 连接串中除了login database=数据库名 user = '用户名' password = '口令' 外,其余为可选项,若未指定那些项,则系统为连接设置默认值
  11. 数据解密口令:用于启动加密数据库,若库未加密,则可不要,但带上此参数不会影响连接
  12. 客户端使用的字符集名: 'GB2312' ,'GBK','BIG5' 等,默认为GBK
  13. 时区: 'GMT +08:00'
  14. 事务隔离级别:
  15. 'READ COMMITED':读已提交
  16. 'REPEATIABLE READ':可重复读
  17. 'SERIALIZABLE':序列化
  18. 加锁超时:
  19. 毫秒数,表示本连接中的事务在争用锁时,最多等候的时间,若在此时间内加锁不成功,则回滚事务并报错
  20. auto_commit:
  21. on:表示自动提交,即每个命令都作为一个事务,命令完成立即提交
  22. off:非自动提交,需要 commit命令才提交
  23. strict_commit: 是否该连接中执行的事务使用严格提交(即须记实了事务日志才向客户端返回'K')
  24. result='char': 当设置了该项后,则float,integer等不以字串方式返回的结果皆强制使用字符串方式返回(此项对于odbc,jdbc等标准驱动皆不使用)
  25. return_schema: 是否在返回字段名信息时加上模式名,若设置为'on',则返回的字段名形式为: 模式名.表名.字段名 '%' 别名,否则返回的字段名形式为:表名.字段名 '%' 别名
  26. return_cursor_id: 若该项设置为'on',则存贮过程的ref_cursor的返回值为cursor的ID号,此时,客户端若要使用ref_currsor的结果,则应使用fetch命令,cursor的名为: 'CurN' + 游标号的16进制字串,
  27. 若该项设置为off或没有该项,则将在返回结果中直接嵌入ref_cursor的结果集
  28. lob_ret='descriptor': 该项目前服务器版本中没有,拟新加入,若有该项,则在返回大对象时不以数据形式返回,代之以描述符,当真正需要大对象数据时,使用 GET LOB 大对象描述符;命令从服务器取回数据
  29. version:
  30. 客户端协议版本,目前都应是:'201'
  31. 1.2 服务器端: 发回字节'K'表示成功,否则,发回错误信息(见错误信息格式)并立即关闭连接
  32. 2.所有DML及DDL访问:
  33. 2.1 客户端发出访问:
  34. QryStream: '?' Comand_Len Comand_str Param_num { Param_name_len Param_name Param_INOUT Param_DType Param_Data_Len Param_Data }*
  35. ? 5 ? STC 1 0 1 type_int 4 1
  36. 解释:
  37. Command_len: 命令长度(网络序32位整数,计算命令长度时不包括结束符0x0)
  38. Command_str: 命令字串(发送时应包括结束符0x0)
  39. Param_num: 参数个数(网络序16位整数,若没有参数则此值为0)
  40. Param_name_len: 参数名字长度(网络序短整数,若参数无名,则此值为0)
  41. Param_name: 参数名(该部分字节数应与Param_name_Len一致)
  42. Param_INOUT: 参数输出输入类型(网络序16位整数)
  43. Param_DType: 参数数据类型号(网络序16位整数)
  44. Param_Data_Len: 参数长度(网络序32位整数)
  45. Param_Data: 参数数据(该部分字节数应与Param_Data_Len一致)
  46. {}*: 表示参数部分可有0至多个参数,其重复的次数取决于Param_num,若Param_num为0,则没有参数需要发送
  47. 2.2 服务器返回: 服务器可返回一组或多组信息,并以字节'K'标识所有信息已传送完毕
  48. SrvResponse: { FormArgDescri | SelectResult | InsertResult | UpdateResult | DeleteResult | ProcRet | OutParamRet | ErrInfo | WarnInfo | Message }* 'K'
  49. FormArgDescri: '$' Arg_Num { Arg_Name_Len Arg_Name Arg_No Arg_DType Arg_Preci_Scale }+
  50. SelectResult: 'A' Field_Num { Field_Name_Len Field_Name Field_DType Field_Preci_Scale Field_Flag }+ { 'R' Col_len1 Col_Data1 ... }*
  51. InsertResult: 'I' Rowid_Len Rowid_Data
  52. UpdateResult: 'U' Update_Num
  53. DeleteResult: 'D' Delete_Num
  54. ProcRet: 'O' Ret_DType Ret_Data_Len Ret_Data
  55. OutParamRet: 'P' Out_Param_No Out_Param_DType Out_Param_Len Out_Param_Data
  56. ErrInfo: 'E' Err_Str_Len Err_Str
  57. WarnInfo: 'W' Warn_Str_Len Warn_Str
  58. Message: 'M' Msg_Str_Len Msg_Str
  59. 解释:
  60. FormArgDescri: 形式参数描述,执行prepare语句后,通常返回此部分信息
  61. Arg_Num: 形参个数(网络序32位整数)
  62. Arg_Name_Len: 形参名长度(网络序32位整数)
  63. Arg_Name: 形参名(字节数与Arg_Name_Len一致)
  64. Ar_No: 形参的序号(网络序32位整数,若prepare语句中使用?号表示参数,则服务器按?号的顺序从1开始为其设定序号)
  65. Argg_DType: 形参的数据类型ID(网络序32位整数)
  66. Arg_Preci_Scale: 形参的精度标度(网络序32位整数
  67. SelectResult: 查询结果集,包含一组结果集字段描述 以及0至多个行数据
  68. Field_Num: 结果集字段数
  69. Field_Name_Len: 字段名长度(网络序32位整数)
  70. Field_Name: 字段名(字节数与Field_Name_Len一致)
  71. Field_DType: 字段数据类型ID(网络序32位整数)
  72. Field_Preci_Scale:字段的精度标度(网络序32位整数,若为-1或0表示没有精度标度信息,否则高16位为精度低16位为标度)
  73. Field_Flag: 字段的其它属性标志(网络序32位整数),其中每一个位表征字段的某一个特性,各位对应的特性如下
  74. FIELD_BASE_TAB=1, /* 表示字段是实际的表的字段(否则,表示字段实际上是表达式) */
  75. FIELD_NOT_NULL=2, /* 表示字段具有非空约束 */
  76. FIELD_IS_PRIMARY=4, /* 表示字段是主键 */
  77. FIELD_IS_SERIAL=8, /* 表示字段是序列值 */
  78. FIELD_IS_TIMESTAMP=16, /* 表示字段是timestamp */
  79. FIELD_IS_LOB=32, /* 表示字段是大对象类型 */
  80. FIELD_IS_UNIQUE=64, /* 表示字段是唯一值类型 */
  81. FIELD_IS_ROWID=128, /* 表示字段是rowid */
  82. FIELD_IS_DUMMY=256, /* 表示字段不应输出 */
  83. FIELD_IS_HIDE=512, /* 表示字段是隐藏字段 */
  84. Col_len: 列数据长度(网络序32位整数)
  85. Col_Data: 列数据(字节数与Col_Len一致)
  86. 注: 返回结果中,记录数据由 'R'开头,后跟若干个列的长度及数据,每个'R'后的列数据个数为Field_Num个
  87. InsertResult: 插入语句的返回结果
  88. Rowid_Len: 插入语句返回的新行的ROWID数据的长度
  89. Rowid_Data: 插入语句返回的新行的ROWID数据(为base64编码)
  90. UpdateResult: 更改语句返回的结果
  91. Update_Num: 更改语句影响的行数(网络序32位整数)
  92. DeleteResult: 删除语句的返回结果
  93. Delete_Num: 删除的行数
  94. ProcRet: 存贮函数调用的返回值
  95. Ret_DType: 返回值数据类型(网络序32位整数)
  96. Ret_Data_Len: 返回值数据长度(网络序32位整数)
  97. Ret_Data: 返回值数据
  98. OutParamRet: 返回型参数
  99. Out_Param_No: 返回型参数的参数号
  100. Out_Param_DType:返回参数的数据类型(网络序32位整数)
  101. Out_Param_Len: 返回参数的数据长度(网络序32位整数)
  102. Out_Param_Date: 返回参数的数据
  103. ErrInfo: 错误信息(通常在返回数据的最后出现,即出现在 'K'字符前)
  104. Err_Str_Len: 错误信息长度(网络序32位整数)
  105. Err_Str: 错误信息(字节数与Err_Str_Len一致)
  106. WarnInfo: 警告信息(通常在返回数据的最后出现,即出现在 'K'字符前)
  107. Warn_Str_Len: 警告信息长度(网络序32位整数)
  108. Warn_Str: 警告信息(字节数与Warn_Str_Len一致)
  109. Message: 通知信息(出现的位置没有一定的规定)
  110. Msg_Str_Len: 通知信息长度(网络序32位整数)
  111. Msg_Str: 通知信息(字节数与Msg_Str_Len一致)
  112. 注: {}* 中各种返回信息是并列的关系,可能一次返回中含有0个至多个返回信息,不能假定改到其中其种返回信息就认为没有其它种类的返回信息,
  113. 有些类型的返回信息甚至可能重重出现,如:一次发多条select 语句就会造成返回信息中包含多个查询结果集.
  114. 2.3 关于新版本中将增加的大对象数据返回形式的说明
  115. a) 当在连接中未加入了 lob_ret='descriptor'子串时,使用原来的方式返回大对象数据
  116. b) 当在连接中加入了 lob_ret='descriptor'子串时,应该将大对象对应的列返回值视作描述符,描述符分两种:一种为内嵌在行内的大对象数据的描述符,一种为非内嵌大对象描述符
  117. 内嵌大对象描述符:
  118. BLOB类型:'b' + 大对象数据 即:大对象数据仍直接返回,只是前面加了一个 'b'字符,因此大对象数据的长度实际为列数据长度-1
  119. CLOB类型:'c' + 大对象数据 即:大对象数据仍直接返回,只是前面加了一个 'c'字符,因此大对象数据的长度实际为列数据长度-1
  120. 非内嵌大对象描述符:
  121. BLOB类型: 'B' + 大对象描述符字串 ,该字符串由两部分组成:前面为descriptor的base64编码,后面为大对象的数据长度(10进制数值串),
  122. 中间由空格分开;整个串的长度为列数据长度-1;
  123. CLOB类型: 'C' + 大对象描述符字串,其余与BLOB相同
  124. c) 当大对象字段返回的字段长度为0时,仍表示该字段为空值,不能再去取该字段的数据作为描述符用
  125. d) 对于内嵌大对象,驱动应保存其数据,而不能从服务器另取数据
  126. e) 对于非内嵌大对象,驱动在向应用程序返回数据时使用:
  127. GET LOB '大对象描述符' offset 偏移量 limit 读取长度; 命令来读取大对象数据. (注意:大对象描述符串包括前面的‘B’或‘C’,
  128. 但不包含后面的大对象长度字串,描述前后有'号)
  129. 服务端以单行单列结果集的形式返回数据:
  130. 对于BLOB,返回的字段名为:BLOBDATA,返回记录的数据长度为实际读取长度(通常就是limit,若已读到尾,则小于limit),
  131. 对于CLOB,返回的字段名为:CLOBDATA,若不存在库字符集与客户端字符集的差异,则返回记录的数据长度为实际读取长度,
  132. 否则,返回的数据长度为字符集转换后的长度,当然,内容也就为转换后的内容。
  133. 3.数据类型ID的取值:以下取值未写明数值的按有数值的依次向下增1
  134. TYPE_EMPTY = 0,
  135. TYPE_NULL,
  136. TYPE_BOOL,
  137. TYPE_I1,
  138. TYPE_UI1,
  139. TYPE_I2,
  140. TYPE_UI2,
  141. TYPE_I4,
  142. TYPE_UI4,
  143. TYPE_I8,
  144. TYPE_UI8,
  145. TYPE_R4,
  146. TYPE_R8,
  147. TYPE_DATE,
  148. TYPE_TIME,
  149. TYPE_DATETIME,
  150. TYPE_TIMESTAMP,
  151. TYPE_INTERVAL_D2S,
  152. TYPE_SMALLTIME,
  153. TYPE_TIME_TZ,
  154. TYPE_DATETIME_TZ,
  155. TYPE_INTERVAL_Y2M,
  156. TYPE_DECIMAL,
  157. TYPE_NUMERIC,
  158. TYPE_CY,
  159. TYPE_STR,
  160. TYPE_CHAR,
  161. TYPE_VARCHAR,
  162. TYPE_CLOB,
  163. TYPE_BINARY,
  164. TYPE_BLOB,
  165. TYPE_IMAGE,
  166. TYPE_BLOB_INROW,
  167. TYPE_BLOB_S,
  168. TYPE_BLOB_M,
  169. TYPE_BLOB_OM,
  170. TYPE_STREAM,
  171. TYPE_AUDIO,
  172. TYPE_VIDEO,
  173. TYPE_ROWVER,
  174. TYPE_INTERVAL_Y,
  175. TYPE_INTERVAL_M,
  176. TYPE_INTERVAL_D,
  177. TYPE_INTERVAL_H,
  178. TYPE_INTERVAL_MI,
  179. TYPE_INTERVAL_S,
  180. TYPE_INTERVAL_D2H,
  181. TYPE_INTERVAL_D2M,
  182. TYPE_INTERVAL_H2M,
  183. TYPE_INTERVAL_H2S,
  184. TYPE_INTERVAL_M2S,
  185. TYPE_GUID,
  186. TYPE_GEOMETRY=60,
  187. TYPE_POINT,
  188. TYPE_BOX,
  189. TYPE_POLYLINE,
  190. TYPE_POLYGON,
  191. TYPE_MAX_SYS=100,
  192. TYPE_BLADE_BEGIN=101,
  193. TYPE_BLADE_END=1000,
  194. TYPE_OBJECT=1001, /* 对象类型 */
  195. TYPE_RECORD, /* 记录类型 */
  196. TYPE_VARRAY, /* 数组类型 */
  197. TYPE_TABLE, /* 表类型 */
  198. TYPE_IDXBY_TAB, /* index by 表类型 */
  199. TYPE_ROWTYPE, /* 引用行类型 */
  200. TYPE_COLTYPE, /* 引用列类型 */
  201. TYPE_ROW, /* 行类型 */
  202. TYPE_CUR_REC, /* 引用记录类型(不能更改字段) */
  203. TYPE_CURSOR, /* 游标类型 */
  204. TYPE_REFCUR, /* REF_CURSOR类型 */
  205. TYPE_PARAM,
  206. TYPE_UDT_BEGIN=1100,
  207. 4.数据类型返回格式
  208. 2.1.若连接时连接串中有 result='char',则各类型数据的返回值皆转换成字符串的形式进行返回,
  209. 数值型(integer,float,numeric等),返回的字符串变由数字与小数点组成
  210. 日期型格式:‘2011-3-3’
  211. 时间型格式 ‘12:03:40’或 ‘12:03:40.999'
  212. 日期时间型格式:‘2011-3-3 12:34:23' 或 ‘2011-3-3 12:34:23.999'
  213. 带时区的日期时间格式:‘2011-3-3 12:34:23+08:00' 或‘2011-3-3 12:34:23-08:00'
  214. 带时区的时间格式:‘12:34:23+08:00' 或‘12:34:23-08:00'
  215. 2.2若连接串中不含 result='char',则各类型数据的返回值通常以二进制方式返回
  216. char、varchar、clob、numeric等类型以字符串形式返回
  217. 数值型(integer等除numeric外)返回格式,就是其二进制格式,只是转换成了网络序
  218. date: 32位网络序整数,为从1970-1-1起流失的天数(负数表示在1970-1-1之前)
  219. time: 32位网络序整数,为一天内从0:0:0开始流失的毫秒数
  220. datetime:64位网络序整数,为从1970-1-1起流失的毫秒数(负数表示在1970-1-1之前)
  221. time with time zone:6字节,前4字节为32位网络序时间值,后2字节为16位网络序时区值,时间值与time的处理方式一样,
  222. 时区值为时区相对于格林威治天文台的时差,单位为分钟,有正负之分。
  223. datetime with time zone:10字节,前8字节为64位网络序日期时间值,后2字节为16位网络序时区值,日期时间值与datetime的处理方式一样,
  224. 时区值为时区相对于格林威治天文台的时差,单位为分钟,有正负之分。
  225. interval year: 32位网络序整数,单位为年
  226. interval month: 32位网络序整数,单位为月
  227. interval day: 32位网络序整数,单位为天
  228. interval hour: 32位网络序整数,单位为小时
  229. interval minute:32位网络序整数,单位为分钟
  230. interval second:64位网络序整数,单位为毫秒(微秒 CYJ)
  231. 注:interval XX to YY(如interval day to second)其返回的值的格式与 interval YY相同,
  232. 即:interval day to second 返回格式与interval second相同,余类推