lobj.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:3k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /* Module:          lobj.c
  2.  *
  3.  * Description:     This module contains routines related to manipulating
  4.  *                  large objects.
  5.  *
  6.  * Classes:         none
  7.  *
  8.  * API functions:   none
  9.  *
  10.  * Comments:        See "notice.txt" for copyright and license information.
  11.  *
  12.  */
  13. #include "lobj.h"
  14. #include "psqlodbc.h"
  15. #include "connection.h"
  16. Oid
  17. lo_creat(ConnectionClass *conn, int mode)
  18. {
  19. LO_ARG argv[1];
  20. int retval, result_len;
  21. argv[0].isint = 1;
  22. argv[0].len = 4;
  23. argv[0].u.integer = mode;
  24. if ( ! CC_send_function(conn, LO_CREAT, &retval, &result_len, 1, argv, 1))
  25. return 0; // invalid oid
  26. else
  27. return retval;
  28. }
  29. int
  30. lo_open(ConnectionClass *conn, int lobjId, int mode)
  31. {
  32. int fd;
  33. int result_len;
  34. LO_ARG argv[2];
  35. argv[0].isint = 1;
  36. argv[0].len = 4;
  37. argv[0].u.integer = lobjId;
  38. argv[1].isint = 1;
  39. argv[1].len = 4;
  40. argv[1].u.integer = mode;
  41. if ( ! CC_send_function(conn, LO_OPEN, &fd, &result_len, 1, argv, 2))
  42. return -1;
  43. if (fd >= 0 && lo_lseek(conn, fd, 0L, SEEK_SET) < 0)
  44. return -1;
  45. return fd;
  46. }
  47. int 
  48. lo_close(ConnectionClass *conn, int fd)
  49. {
  50. LO_ARG argv[1];
  51. int retval, result_len;
  52. argv[0].isint = 1;
  53. argv[0].len = 4;
  54. argv[0].u.integer = fd;
  55. if ( ! CC_send_function(conn, LO_CLOSE, &retval, &result_len, 1, argv, 1))
  56. return -1;
  57. else
  58. return retval;
  59. }
  60. int
  61. lo_read(ConnectionClass *conn, int fd, char *buf, int len)
  62. {
  63. LO_ARG argv[2];
  64. int result_len;
  65. argv[0].isint = 1;
  66. argv[0].len = 4;
  67. argv[0].u.integer = fd;
  68. argv[1].isint = 1;
  69. argv[1].len = 4;
  70. argv[1].u.integer = len;
  71. if ( ! CC_send_function(conn, LO_READ, (int *) buf, &result_len, 0, argv, 2))
  72. return -1;
  73. else
  74. return result_len;
  75. }
  76. int
  77. lo_write(ConnectionClass *conn, int fd, char *buf, int len)
  78. {
  79. LO_ARG argv[2];
  80. int retval, result_len;
  81. if (len <= 0)
  82. return 0;
  83. argv[0].isint = 1;
  84. argv[0].len = 4;
  85. argv[0].u.integer = fd;
  86. argv[1].isint = 0;
  87. argv[1].len = len;
  88. argv[1].u.ptr = (char *) buf;
  89. if ( ! CC_send_function(conn, LO_WRITE, &retval, &result_len, 1, argv, 2))
  90. return -1;
  91. else
  92. return retval;
  93. }
  94. int
  95. lo_lseek(ConnectionClass *conn, int fd, int offset, int whence)
  96. {
  97. LO_ARG argv[3];
  98. int retval, result_len;
  99. argv[0].isint = 1;
  100. argv[0].len = 4;
  101. argv[0].u.integer = fd;
  102. argv[1].isint = 1;
  103. argv[1].len = 4;
  104. argv[1].u.integer = offset;
  105. argv[2].isint = 1;
  106. argv[2].len = 4;
  107. argv[2].u.integer = whence;
  108. if ( ! CC_send_function(conn, LO_LSEEK, &retval, &result_len, 1, argv, 3))
  109. return -1;
  110. else
  111. return retval;
  112. }
  113. int
  114. lo_tell(ConnectionClass *conn, int fd)
  115. {
  116. LO_ARG argv[1];
  117. int retval, result_len;
  118. argv[0].isint = 1;
  119. argv[0].len = 4;
  120. argv[0].u.integer = fd;
  121. if ( ! CC_send_function(conn, LO_TELL, &retval, &result_len, 1, argv, 1))
  122. return -1;
  123. else
  124. return retval;
  125. }
  126. int 
  127. lo_unlink(ConnectionClass *conn, Oid lobjId)
  128. {
  129. LO_ARG argv[1];
  130. int retval, result_len;
  131. argv[0].isint = 1;
  132. argv[0].len = 4;
  133. argv[0].u.integer = lobjId;
  134. if ( ! CC_send_function(conn, LO_UNLINK, &retval, &result_len, 1, argv, 1))
  135. return -1;
  136. else
  137. return retval;
  138. }