postgresql: 大对象(二:文档中未曾说明的服务端函数)
时间:2009-10-16 来源:trainee
在PostgreSQL官方文档中,涉及大对象的操作函数有分客户端和服务端,客户端函数是封装在libpq库中。必须通过c调用。然而设计实际应用时,并不是都是用c+libpq这种形式,常常用odbc, ado或jdbc等接口,所以客户端函数对我们没有多大用处。
实际上,libpq上封装的客户端函数也是简单调用服务端函数(lo_export,lo_import除外),但在官方文档中却没有完全介绍这些服务端函数。大家可以通过以下命令获取大对象服务端函数的清单:
select * from pg_proc where proname like 'lo%';
现在依次介绍,注意以下是服务端函数,虽然有些和客户端同名,但性质不一样,服务端函数可在任何语言中以发送SQL语句的方式调用。
1、lo_creat(int open_mode) -- 建立一个新的空白大对象,open_mode为打开类型,这是个过时的标志,目前以-1代替,返回大对象地址(整型)oid。
2、lo_create(oid loid) -- 建立一个地址为loid的空白大对象,返回大对象地址oid(整型)。
3、lo_unlink(oid loid) -- 删除一个地址为loid的大对象,返回整型 1-成功 -1 -失败。
4、lo_import(text filename) -- 将服务器文件filename的数据导入一个新的大对象,返回大对象地址oid(整型)。
5、lo_export(oid loid, text filename) --将大对象loid的数据导出到一个服务器文件filename中,返回导出长度(整型)。
注意以上2个函数是很危险的命令,必须要有数据库超级用户super的权限。同时服务器文件filename必须是运行服务器的操作系统用户(默认是postgres)所能读写的。
以上2个函数的存在是postgres服务程序不允许由root启动的原因之一,否则服务器的操作系统就没有安全可言。
客户端函数也有以上2个相同名称的函数,但读写的是客户端的文件,性质是不一样的。客户端的这2个函数可以由以下函数封装。 接着继续介绍文档未曾公开的服务端函数: 6、lo_open(oid loid, integer open_mode) -- 打开一个地址为loid的大对象,为读写做准备,open_mode为打开类型: inv_write(写,值为131072)、inv_read(读,值为262144)或者inv_write|inv_read (读写,值为393216)。返回文件句柄fd(整型),若fd为负数,失败。 7、loread(integer fd, integer len) -- 读句柄fd当前位置开始的len大小的数据,返回数据内容(bytea类型)。 8、lowrite(integer fd, bytea buf) -- 在句柄fd当前位置开始将二进制数据buf写入大对象中,返回所写的长度(整型)。 9、lo_lseek(integer fd, integer offset, integer whence) -- 改变句柄fd当前的读写位置。whence是寻址方式,seek_set(值为0)从对象头开始,seek_cur(值为1)从当前读写位置开始,seek_end(值为2)从对象尾开始,offset是偏移尺寸。返回新的读写位置(整型),-1表示错误。 注:loread、lowrite会自动改变当前读写位置,所以若顺序读写,lo_lseek这个命令就没什么用。 10、lo_tell(integer fd) -- 返回句柄fd的当前位置(整型) 11、lo_truncate(integer fd, integer len) -- 截取句柄fd所打开的大对象长度为len大小。若len大于原来大对象的长度,会在大对象后缀一个'\0'字符。成功返回0,失败为负数。 12、lo_close(integer fd) -- 关闭句柄fd, 成功返回0,失败为负数。 以上6-12函数必须在一个transaction内完成,也就是说句柄fd只在一个事务内有效,事务结束它自动关闭。
以上2个函数的存在是postgres服务程序不允许由root启动的原因之一,否则服务器的操作系统就没有安全可言。
客户端函数也有以上2个相同名称的函数,但读写的是客户端的文件,性质是不一样的。客户端的这2个函数可以由以下函数封装。 接着继续介绍文档未曾公开的服务端函数: 6、lo_open(oid loid, integer open_mode) -- 打开一个地址为loid的大对象,为读写做准备,open_mode为打开类型: inv_write(写,值为131072)、inv_read(读,值为262144)或者inv_write|inv_read (读写,值为393216)。返回文件句柄fd(整型),若fd为负数,失败。 7、loread(integer fd, integer len) -- 读句柄fd当前位置开始的len大小的数据,返回数据内容(bytea类型)。 8、lowrite(integer fd, bytea buf) -- 在句柄fd当前位置开始将二进制数据buf写入大对象中,返回所写的长度(整型)。 9、lo_lseek(integer fd, integer offset, integer whence) -- 改变句柄fd当前的读写位置。whence是寻址方式,seek_set(值为0)从对象头开始,seek_cur(值为1)从当前读写位置开始,seek_end(值为2)从对象尾开始,offset是偏移尺寸。返回新的读写位置(整型),-1表示错误。 注:loread、lowrite会自动改变当前读写位置,所以若顺序读写,lo_lseek这个命令就没什么用。 10、lo_tell(integer fd) -- 返回句柄fd的当前位置(整型) 11、lo_truncate(integer fd, integer len) -- 截取句柄fd所打开的大对象长度为len大小。若len大于原来大对象的长度,会在大对象后缀一个'\0'字符。成功返回0,失败为负数。 12、lo_close(integer fd) -- 关闭句柄fd, 成功返回0,失败为负数。 以上6-12函数必须在一个transaction内完成,也就是说句柄fd只在一个事务内有效,事务结束它自动关闭。
相关阅读 更多 +