Chinaunix首页 | 论坛 | 博客
  • 博客访问: 208859
  • 博文数量: 21
  • 博客积分: 1546
  • 博客等级: 上尉
  • 技术积分: 290
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-10 14:54
文章分类

全部博文(21)

文章存档

2020年(1)

2019年(3)

2015年(2)

2014年(1)

2011年(1)

2009年(7)

2008年(4)

2007年(2)

我的朋友

分类:

2009-10-16 08:51:59

在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只在一个事务内有效,事务结束它自动关闭。
阅读(2929) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~