diff options
Diffstat (limited to 'src/interfaces/odbc/lobj.c')
-rw-r--r-- | src/interfaces/odbc/lobj.c | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/src/interfaces/odbc/lobj.c b/src/interfaces/odbc/lobj.c new file mode 100644 index 00000000000..29cdd2ef048 --- /dev/null +++ b/src/interfaces/odbc/lobj.c @@ -0,0 +1,197 @@ + +/* Module: lobj.c + * + * Description: This module contains routines related to manipulating + * large objects. + * + * Classes: none + * + * API functions: none + * + * Comments: See "notice.txt" for copyright and license information. + * + */ + +#include "lobj.h" +#include "psqlodbc.h" +#include "connection.h" + +Oid +lo_creat(ConnectionClass *conn, int mode) +{ +LO_ARG argv[1]; +int retval, result_len; + + argv[0].isint = 1; + argv[0].len = 4; + argv[0].u.integer = mode; + + if ( ! CC_send_function(conn, LO_CREAT, &retval, &result_len, 1, argv, 1)) + return 0; // invalid oid + else + return retval; + + +} + +int +lo_open(ConnectionClass *conn, int lobjId, int mode) +{ +int fd; +int result_len; +LO_ARG argv[2]; + + + argv[0].isint = 1; + argv[0].len = 4; + argv[0].u.integer = lobjId; + + argv[1].isint = 1; + argv[1].len = 4; + argv[1].u.integer = mode; + + if ( ! CC_send_function(conn, LO_OPEN, &fd, &result_len, 1, argv, 2)) + return -1; + + if (fd >= 0 && lo_lseek(conn, fd, 0L, SEEK_SET) < 0) + return -1; + + return fd; +} + +int +lo_close(ConnectionClass *conn, int fd) +{ +LO_ARG argv[1]; +int retval, result_len; + + + argv[0].isint = 1; + argv[0].len = 4; + argv[0].u.integer = fd; + + if ( ! CC_send_function(conn, LO_CLOSE, &retval, &result_len, 1, argv, 1)) + return -1; + + else + return retval; + +} + + +int +lo_read(ConnectionClass *conn, int fd, char *buf, int len) +{ +LO_ARG argv[2]; +int result_len; + + + argv[0].isint = 1; + argv[0].len = 4; + argv[0].u.integer = fd; + + argv[1].isint = 1; + argv[1].len = 4; + argv[1].u.integer = len; + + if ( ! CC_send_function(conn, LO_READ, (int *) buf, &result_len, 0, argv, 2)) + return -1; + + else + return result_len; +} + +int +lo_write(ConnectionClass *conn, int fd, char *buf, int len) +{ +LO_ARG argv[2]; +int retval, result_len; + + + if (len <= 0) + return 0; + + argv[0].isint = 1; + argv[0].len = 4; + argv[0].u.integer = fd; + + argv[1].isint = 0; + argv[1].len = len; + argv[1].u.ptr = (char *) buf; + + if ( ! CC_send_function(conn, LO_WRITE, &retval, &result_len, 1, argv, 2)) + return -1; + + else + return retval; +} + +int +lo_lseek(ConnectionClass *conn, int fd, int offset, int whence) +{ +LO_ARG argv[3]; +int retval, result_len; + + + argv[0].isint = 1; + argv[0].len = 4; + argv[0].u.integer = fd; + + argv[1].isint = 1; + argv[1].len = 4; + argv[1].u.integer = offset; + + argv[2].isint = 1; + argv[2].len = 4; + argv[2].u.integer = whence; + + if ( ! CC_send_function(conn, LO_LSEEK, &retval, &result_len, 1, argv, 3)) + return -1; + + else + return retval; +} + +int +lo_tell(ConnectionClass *conn, int fd) +{ +LO_ARG argv[1]; +int retval, result_len; + + + argv[0].isint = 1; + argv[0].len = 4; + argv[0].u.integer = fd; + + if ( ! CC_send_function(conn, LO_TELL, &retval, &result_len, 1, argv, 1)) + return -1; + + else + return retval; +} + +int +lo_unlink(ConnectionClass *conn, Oid lobjId) +{ +LO_ARG argv[1]; +int retval, result_len; + + + argv[0].isint = 1; + argv[0].len = 4; + argv[0].u.integer = lobjId; + + if ( ! CC_send_function(conn, LO_UNLINK, &retval, &result_len, 1, argv, 1)) + return -1; + + else + return retval; +} + + + + + + + + |