设为首页 加入收藏

TOP

postgresql: 大对象(三:文件上传例子)
2014-11-24 07:31:12 来源: 作者: 【 】 浏览:1
Tags:postgresql: 对象 文件 上传 例子
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://www.2cto.com/database/201309/241948. html
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇GPDB管理员笔记(一)数据库对象 下一篇MongoDB增加用户认证:增加用户、..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Libevent C++ 高并发 (2025-12-26 00:49:30)
·C++ dll 设计接口时 (2025-12-26 00:49:28)
·透彻理解 C 语言指针 (2025-12-26 00:22:52)
·C语言指针详解 (经典 (2025-12-26 00:22:49)
·C 指针 | 菜鸟教程 (2025-12-26 00:22:46)