PostgreSQL: kèo chấp bóng đá hôm nay liệu: 9.4: PostgreSQL | |||
---|---|---|---|
prev | UP | Chương 32. Các đối tượng kèo bóng đá pháp | Tiếp theo |
Phần này mô tả các cơ sởPostgreSQL'slibpqThư viện kèo bóng đá pháp cung cấp để truy cập các đối tượng lớn. ThePostgreSQLkèo bóng đá pháp đối tượng lớn được mô hình hóa sauUNIXkèo bóng đá pháp hệ thống tệp, với các chất tương tựMở
,đọc
,Viết
,LSEEK
, v.v.
Tất cả các thao tác đối tượng kèo bóng đá pháp bằng cách sử dụng các chức năng nàyphảidiễn ra trong một khối kèo bóng đá pháp dịch SQL, vì các mô tả tệp đối tượng lớn chỉ có giá trị trong suốt thời gian kèo bóng đá pháp dịch.
Nếu xảy ra lỗi trong khi thực hiện bất kỳ một trong các hàm này, hàm sẽ trả về giá trị không thể tin được, thường là 0 hoặc -1. Một thông báo mô tả lỗi được lưu trữ trong đối kèo bóng đá pháp kết nối và có thể được truy xuất vớipqerrormessage
.
Ứng dụng kèo bóng đá pháp sử dụng các chức năng này nên bao gồm tệp tiêu đềlibpq/libpq-fs.hvà liên kết vớilibpqThư viện.
hàm
oid lo_creat (pgconn *Conn, int mode);
Tạo một đối tượng kèo bóng đá pháp mới. Giá trị trả về là OID được gán cho đối tượng kèo bóng đá pháp mới hoặckhông hợp lệ(không) về thất bại.Modekhông được sử dụng và bỏ qua nhưPostgreSQL8.1; Tuy nhiên, để tương thích ngược với các bản phát hành trước đó, tốt nhất là đặt nó thànhinv_read,inv_writehoặcinv_read | inv_write. (Các hằng số kèo bóng đá pháp trưng này được xác định trong tệp tiêu đềlibpq/libpq-fs.h.)
Một ví dụ:
inv_oid = lo_creat (Conn, inv_read | inv_write);
hàm
oid lo_create (pgconn *Conn, oid lobjid);
cũng tạo ra một đối tượng kèo bóng đá pháp mới. OID được gán có thể được chỉ định bởilobjid; Nếu vậy, thất bại xảy ra nếu OID đó đã được sử dụng cho một số đối tượng kèo bóng đá pháp.lobjidlàkhông hợp lệ(không) sau đóLO_CREATE
gán OID không sử dụng (đây là hành vi tương tự nhưlo_creat
). Giá trị trả về là OID được gán cho đối tượng kèo bóng đá pháp mới hoặckhông hợp lệ(không) về thất bại.
LO_CREATE
là mới nhưPostgreSQL8.1; Nếu chức năng này chạy so với phiên bản kèo bóng đá pháp chủ cũ hơn, nó sẽ thất bại và trả vềkhông hợp lệ.
Một ví dụ:
inv_oid = lo_create (Conn, mong muốn_oid);
Để nhập tệp hệ điều hành dưới dạng đối tượng kèo bóng đá pháp, gọi
oid lo_import (pgconn *Conn, const char *filename);
FileNameChỉ định tên hệ điều hành của tệp sẽ được nhập dưới dạng một đối tượng kèo bóng đá pháp. Giá trị trả về là OID được gán cho đối tượng kèo bóng đá pháp mới hoặckhông hợp lệ(không) về thất bại. Lưu ý rằng tệp được đọc bởi thư viện kèo bóng đá pháp, không phải bởi máy chủ;
hàm
oid lo_import_with_oid (pgconn *Conn, const char *filename, oid lobjid);
Cũng nhập một đối tượng kèo bóng đá pháp mới. OID được gán có thể được chỉ định bởilobjid; Nếu vậy, thất bại xảy ra nếu OID đó đã được sử dụng cho một số đối tượng kèo bóng đá pháp.lobjidlàkhông hợp lệ(không) sau đólo_import_with_oid
gán OID không sử dụng (đây là hành vi tương tự nhưLO_IMPORT
). Giá trị trả về là OID được gán cho đối tượng kèo bóng đá pháp mới hoặckhông hợp lệ(không) về thất bại.
lo_import_with_oid
là mới nhưPostgreSQL8.4 và sử dụngLO_CREATE
Nội bộ mới trong 8.1; Nếu chức năng này được chạy so với 8.0 hoặc trước đó, nó sẽ thất bại và trả vềkhông hợp lệ.
Để xuất một đối tượng kèo bóng đá pháp vào tệp hệ điều hành, hãy gọi
int lo_export (pgconn *Conn, oid lobjid, const char *filename);
ThelobjidĐối số chỉ định oid của đối tượng kèo bóng đá pháp để xuất vàFileNameĐối số Chỉ định tên hệ điều hành của tệp. Lưu ý rằng tệp được viết bởi thư viện kèo bóng đá pháp, không phải bởi máy chủ.
Để mở một đối tượng kèo bóng đá pháp hiện có để đọc hoặc viết, gọi
int lo_open (pgconn *Conn, oid lobjid, int mode);
ThelobjidĐối số chỉ định oid của đối tượng kèo bóng đá pháp để mở. TheModeĐiều khiển bit xem đối kèo bóng đá pháp có được mở để đọc không (inv_read), Viết (inv_write) hoặc cả hai. (Các hằng số kèo bóng đá pháp trưng này được xác định trong tệp tiêu đềlibpq/libpq-fs.h.)LO_OPEN
Trả về một mô tả đối tượng kèo bóng đá pháp (không âm) để sử dụng saulo_read
,lo_write
,lo_lseek
,LO_LSEEK64
,lo_tell
,LO_TELL64
,LO_TRUNCATE
,LO_TRUNCATE64
vàlo_close
. Bộ mô tả chỉ có giá trị trong suốt thời gian của kèo bóng đá pháp dịch hiện tại.
kèo bóng đá pháp chủ hiện không phân biệt giữa các chế độinv_writevàinv_read | inv_write: Bạn được phép đọc từ bộ mô tả trong cả hai trường hợp. Tuy nhiên có một sự khác biệt đáng kể giữa các chế độ này vàinv_readmột mình: vớiinv_readBạn không thể viết trên bộ mô tả và dữ liệu được đọc từ nó sẽ phản ánh nội dung của đối tượng lớn tại thời điểm ảnh chụp nhanh kèo bóng đá pháp dịch đang hoạt động khiLO_OPEN
đã được thực hiện, bất kể sau đó viết bởi các kèo bóng đá pháp dịch này hoặc các kèo bóng đá pháp dịch khác. Đọc từ một mô tả được mở bằnginv_writeTrả về dữ liệu phản ánh tất cả các văn bản của các kèo bóng đá pháp dịch cam kết khác cũng như ghi về kèo bóng đá pháp dịch hiện tại. Điều này tương tự như hành vi củaĐọc lặp lạiso vớiĐọc cam kếtChế độ kèo bóng đá pháp dịch cho SQL thông thườngChọnlệnh.
Một ví dụ:
inv_fd = lo_open (Conn, inv_oid, inv_read | inv_write);
hàm
int lo_write (pgconn *Conn, int fd, const char *buf, size_t len);
Writeslenbyte từBUF(phải có kích thướclen) đến mô tả đối tượng kèo bóng đá phápFD. TheFDĐối số phải được trả lại bởi trước đóLO_OPEN
. Số lượng byte thực sự được viết được trả về (trong quá trình triển khai hiện tại, điều này sẽ luôn bằng nhaulenTrừ khi có lỗi). Trong trường hợp lỗi, giá trị trả về là -1.
mặc dùlenTham số được khai báo làsize_t, Hàm này sẽ từ chối các giá trị độ dài kèo bóng đá pháp hơnint_max. Trong thực tế, tốt nhất là chuyển dữ liệu trong các phần kèo bóng đá pháp nhất là một vài megabyte.
hàm
int lo_read (pgconn *Conn, int fd, char *buf, size_t len);
đọc lên đếnlenbyte từ mô tả đối tượng kèo bóng đá phápFDthànhBUF(phải có kích thướclen). TheFDĐối số phải được trả lại bởi trước đólo_open
. Số lượng byte thực sự đọc được trả về;lenNếu kết thúc của đối tượng kèo bóng đá pháp đạt được trước tiên. Trong trường hợp lỗi, giá trị trả về là -1.
mặc dùlentham số được khai báo làsize_t, Hàm này sẽ từ chối các giá trị độ dài kèo bóng đá pháp hơnint_max. Trong thực tế, tốt nhất là chuyển dữ liệu trong các phần kèo bóng đá pháp nhất là một vài megabyte.
Để thay đổi vị trí đọc hoặc ghi hiện tại được liên kết với một mô tả đối tượng kèo bóng đá pháp, gọi
int lo_lseek (pgconn *Conn, int fd, int offset, int whence);
Hàm này di chuyển con trỏ vị trí hiện tại cho bộ mô tả đối tượng kèo bóng đá pháp được xác định bởiFDđến vị trí mới được chỉ định bởiOffset. Các giá trị hợp lệ chowhencelàSeek_set(tìm kiếm từ bắt đầu đối kèo bóng đá pháp),Seek_cur(tìm kiếm từ vị trí hiện tại) vàSeek_end(tìm kiếm từ cuối đối kèo bóng đá pháp). Giá trị trả về là con trỏ vị trí mới hoặc -1 trên lỗi.
Khi xử lý các đối tượng kèo bóng đá pháp có thể vượt quá kích thước 2GB, thay vào đó sử dụng
21172_21245
Hàm này có hành vi tương tự nhưlo_lseek
, nhưng nó có thể chấp nhậnOffsetkèo bóng đá pháp hơn 2GB và/hoặc mang lại kết quả kèo bóng đá pháp hơn 2GB. Lưu ý rằnglo_lseek
Sẽ thất bại nếu con trỏ vị trí mới sẽ kèo bóng đá pháp hơn 2GB.
LO_LSEEK64
là mới nhưPostgreSQL9.3. Nếu chức năng này được chạy so với phiên bản kèo bóng đá pháp chủ cũ hơn, nó sẽ thất bại và trả về -1.
Để có được vị trí đọc hoặc ghi hiện tại của một mô tả đối tượng kèo bóng đá pháp, gọi
int lo_tell (pgconn *Conn, int fd);
Nếu có lỗi, giá trị trả về là -1.
Khi xử lý các đối tượng kèo bóng đá pháp có thể vượt quá kích thước 2GB, thay vào đó sử dụng
PG_INT64 LO_TELL64 (PGCONN *Conn, Int FD);
Hàm này có hành vi tương tự nhưlo_tell
, nhưng nó có thể mang lại kết quả kèo bóng đá pháp hơn 2GB. Lưu ý rằnglo_tell
Sẽ thất bại nếu vị trí đọc/ghi hiện tại kèo bóng đá pháp hơn 2GB.
LO_TELL64
là mới nhưPostgreSQL9.3. Nếu chức năng này được chạy so với phiên bản kèo bóng đá pháp chủ cũ hơn, nó sẽ thất bại và trả về -1.
Để cắt một đối tượng kèo bóng đá pháp thành một độ dài nhất định, gọi
int lo_truncate (pgcon *Conn, int fd, size_t len);
Hàm này cắt giảm mô tả đối tượng kèo bóng đá phápFDto Longlen. TheFDĐối số phải được trả lại bởi trước đóLO_OPEN
. Nếu nhưlenkèo bóng đá pháp hơn chiều dài dòng điện của đối tượng kèo bóng đá pháp, đối tượng kèo bóng đá pháp được mở rộng đến độ dài được chỉ định với các byte null ('\ 0'). Về thành công,LO_TRUNCATE
Trả về 0. Khi lỗi, giá trị trả về là -1.
Vị trí đọc/ghi được liên kết với mô tảFDkhông thay đổi.
mặc dùlentham số được khai báo làsize_t,LO_TRUNCATE
sẽ từ chối các giá trị độ dài kèo bóng đá pháp hơnint_max.
Khi xử lý các đối tượng kèo bóng đá pháp có thể vượt quá kích thước 2GB, thay vào đó sử dụng
int lo_truncate64 (pgcon *Conn, int fd, pg_int64 len);
Hàm này có hành vi giống nhưLO_TRUNCATE
, nhưng nó có thể chấp nhận AlenGiá trị vượt quá 2GB.
LO_TRUNCATE
là mới nhưPostgreSQL8.3; Nếu chức năng này được chạy so với phiên bản kèo bóng đá pháp chủ cũ hơn, nó sẽ thất bại và trả về -1.
LO_TRUNCATE64
là mới nhưPostgreSQL9.3; Nếu chức năng này được chạy so với phiên bản kèo bóng đá pháp chủ cũ hơn, nó sẽ thất bại và trả về -1.
Một mô tả đối tượng kèo bóng đá pháp có thể được đóng bằng cách gọi
int lo_close (pgconn *Conn, int fd);
WHEREFDlà một mô tả đối tượng kèo bóng đá pháp được trả về bởiLO_OPEN
. Về thành công,lo_close
Trả về 0. Khi lỗi, giá trị trả về là -1.
Bất kỳ mô tả đối tượng lớn nào vẫn mở vào cuối kèo bóng đá pháp dịch sẽ được đóng tự động.
Để loại bỏ một đối tượng kèo bóng đá pháp khỏi cơ sở dữ liệu, gọi
int lo_unlink (pgconn *Conn, oid lobjid);
ThelobjidĐối số chỉ định oid của đối tượng kèo bóng đá pháp để loại bỏ. Trả về 1 nếu thành công, -1 khi thất bại.