summaryrefslogtreecommitdiff
path: root/src/interfaces/odbc/lobj.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/odbc/lobj.c')
-rw-r--r--src/interfaces/odbc/lobj.c197
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;
+}
+
+
+
+
+
+
+
+