Chinaunix首页 | 论坛 | 博客
  • 博客访问: 208845
  • 博文数量: 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 10:56:53

postgresql有一客户端函数lo_import, 封装在libpq, 功能是将客户端的文件上传到服务器的大对象中, 这个函数其实是调用lo_open, lowrite等服务端函数封装而成.现在我们在其他环境下模仿这个例子.
 
用伪语言,大家可转换为自己的语言.
伪函数
SQL(...) 是发送SQL命令的语句
GETSQLRESULT(...) 是获取SQL结果的语句
身略了错误判断,请大家自己完善.
 

function lo_import(string localfile, oid loid ) return integer
{
    // localfile -- 本地文件
    // loid -- 服务端的大对象 若为-1 为新的
   integer new_loid;     // 新的大对象
   integer fd_oid;       // 大对象句柄
   integer fd_localfile; //本地文件句柄
   string l_buf;         // 本地二进制数组

   if(loid == -1)
   {
      SQL("select lo_creat(-1) as result ") // 若为新,建立一个
      new_loid = GETSQLRESULT("result")     // 获取SQL结果集
   }
   else
      new_loid = loid

   SQL("begin transaction")     // 打开一事务
   SQL("select lo_open(?new_loid, 393216) as result")
   fd_oid=GETSQLRESULT("result")      // 获取打开的句柄;

   if(loid <> -1)
   {
       SQL("select lo_truncate(?fd_oid, 0)")

        //如果该大对象已存在, 先清空
   }
       
   fd_localfile=fopen(localfile); // 打开本地文件
   while (l_buf=fread(fd_localfile, 1024) ) // 循环读取1024个字节
   {
      SQL("select lowrite(?fd_oid, ?l_buf)") // 上传到大对象
   }
   fclose(fd_localfile); // 关掉本地文件

   SQL("select lo_close(?fd_oid)"); // 关闭大对象
   SQL("commit");
   
}


关键语句为select lowrite(?fd_oid, ?l_buf)
如果你的接口无法上传二进制数据, 请将l_buf转化为8进制的字符串序列ll_buf,再执行select lowerite(?fd_oid, cast(?ll_buf as bytea))
至于如何转化,请看我的另一编{如何上传二进制数据}http://blog.chinaunix.net/u/24767/showart_2070031.html

 

 

阅读(9666) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~