| PostgreSQL 8.3.3¹®¼ | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 30. Large Objects | Fast Forward | Next |
º» Àý¿¡¼´Â PostgreSQLŬ¶óÀÌ¾ðÆ® ÀÎÅÍÆäÀ̽º ¶óÀ̺귯¸®¿¡¼ Á¦°øµÇ´Â large object¿¡ °üÇÑ ±â´ÉÀ» ¼³¸íÇÕ´Ï´Ù.
ÇÔ¼ö¸¦ »ç¿ëÇÑ large objectÀÇ ¸ðµç Á¶ÀÛÀº SQL Æ®·£Àè¼Ç(transaction) ºí·Ï ³»¿¡¼ ÇàÇØÁöÁö
¾ÊÀ¸¸é ¾ÈµË´Ï´Ù
.
PostgreSQL large object ÀÎÅÍÆäÀ̽º´Â Unix ÆÄÀÏ ½Ã½ºÅÛ ÀÎÅÍÆäÀ̽º¿Í ¿¬°üµÇ¾î ¼³°èµÇ°í ÀÖ¾î
open, read, write, lseek µî °°Àº ÀÎÅÍÆäÀ̽º¸¦ °¡Áö°í ÀÖ½À´Ï´Ù.
libpqÀÇ large object ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇϴ Ŭ¶óÀÌ¾ðÆ® ¾îÇø®ÄÉÀ̼ÇÀº libpq/libpq-fs.h header ÆÄÀÏÀ» Æ÷ÇÔÇØ¼ libpq¶óÀ̺귯¸®¿Í ¸µÅ©ÇØ¾ß ÇÕ´Ï´Ù.
Oid lo_creat(PGconn *conn, int mode);
ÀÌ ÇÔ¼ö´Â large object¸¦ »õ·Î »ý¼ºÇÕ´Ï´Ù. ¸®ÅÏ °ªÀº ½Å±Ô large object¿¡ Æ÷ÇÔµÈ OID·Î, ½ÇÆÐ ½Ã¿¡´Â InvalidOid(0)°¡ ¹ÝȯµË´Ï´Ù. PostgreSQL 8.1¿¡¼´Â mode ´Â »ç¿ëµÇÁö ¾Ê°í ¹«½ÃµË´Ï´Ù. ±×·¯³ª, Àü ¸±¸®½º¿ÍÀÇ backward ȣȯ¼ºÀ» À§Çؼ, INV_READ,INV_WRITE,INV_READ | INV_WRITE·Î ¼³Á¤ÇÏ´Â °ÍÀÌ ÃÖ¼±ÀÔ´Ï´Ù. (ÀÌ·¯ÇÑ »ó¡ÀûÀÎ »ó¼ö´Â libpq/libpq-fs.h header ÆÄÀÏ ³»¿¡ Á¤Àǵǰí ÀÖ½À´Ï´Ù. )
ÀÌÇÏ´Â ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.
inv_oid = lo_creat(conn, INV_READ|INV_WRITE);
Oid lo_create(PGconn *conn, Oid lobjId);
ÀÌ ÇÔ¼öµµ large object¸¦ »õ·Ó°Ô »ý¼ºÇÕ´Ï´Ù.
ÇÒ´çµÈ OID¸¦
lobjId
·Î ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.
±×·¡¼ ±× OID°¡ ÀÌ¹Ì ´Ù¸¥ large object·Î »ç¿ëµÇ°í ÀÖÀ» °æ¿ì´Â ½ÇÆÐÇÏ°Ô µË´Ï´Ù.
lobjId
°¡ InvalidOid(0)ÀÇ °æ¿ì, lo_create´Â »ç¿ëµÇÁö ¾ÊÀº OID¸¦ ÇÒ´çÇÕ´Ï´Ù.
(À̰ÍÀº lo_creat¿Í °°Àº µ¿ÀÛÀÔ´Ï´Ù. )
¸®ÅϰªÀº ½Å±Ô large object¿¡ ÇÒ´çµÇ¾ú´ø OID·Î, ½ÇÆÐ ½Ã¿¡´ÂInvalidOid(0)°¡ ¹ÝȯµÇ¾îÁý´Ï´Ù.
lo_create´Â PostgreSQL 8.1À¸·ÎºÎÅÍ µµÀԵǾú½À´Ï´Ù.
ÀÌ ÇÔ¼ö°¡ ¿À·¡µÈ ¼¹ö ¹öÀü¿¡¼ ½ÇÇàµÉ °æ¿ì, ½ÇÆÐÇÒ °ÍÀ̰í InvalidOid°¡ ¹ÝȯµÉ °ÍÀÔ´Ï´Ù.
¿¹¸¦ ³ªÅ¸³À´Ï´Ù.
inv_oid = lo_create(conn, desired_oid);
operating system ÆÄÀÏÀ» large object·Î importÇÏ·Á¸é, ÀÌÇÏÀÇ ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù.
Oid lo_import(PGconn *conn, const char *filename);
filename ´Â large object·Î¼ importµÇ´Â ÆÄÀÏÀÇ operating system À̸§À» ÁöÁ¤ÇÕ´Ï´Ù. ¸®ÅÏ °ªÀº »õ·Î¿î large objec¿¡ ÇÒ´çµÈ OIDÀÔ´Ï´Ù. ½ÇÆÐ ½Ã´Â InvalidOid(0)°¡ ¹ÝȯµË´Ï´Ù. ÆÄÀÏÀÌ ¼¹ö´Â ¾Æ´Ï°í, Ŭ¶óÀÌ¾ðÆ® ÀÎÅÍÆäÀ̽º ¶óÀ̺귯¸®·ÎºÎÅÍ ÀÐÇôÁö´Â Áö ÁÖÀÇÇϽʽÿä. Áï, ÀÌ ÆÄÀÏÀº Ŭ¶óÀÌ¾ðÆ® ÆÄÀÏ ½Ã½ºÅÛ¿¡ ÀÖ¾î¾ß¸¸Çϰí, Ŭ¶óÀÌ¾ðÆ® ¾îÇø®ÄÉÀ̼ÇÀ¸·ÎºÎÅÍ ÀоîÁú ¼ö ÀÖ½À´Ï´Ù.
large object¸¦ operating system ÆÄÀÏ·Î exportÇÏ·Á¸é, ÀÌÇÏÀÇ ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù.
int lo_export(PGconn *conn, Oid lobjId, const char *filename);
lobjId ÀÎÀÚ´Â exportÇÏ´Â large objectÀÇ OID¸¦ ÁöÁ¤Çϰí, filenameÀÎÀÚ´Â ÆÄÀÏÀÇ operating system À̸§À» ÁöÁ¤ÇÕ´Ï´Ù. ÀÌ ÆÄÀÏÀº ¼¹ö´Â ¾Æ´Ñ, Ŭ¶óÀÌ¾ðÆ® ÀÎÅÍÆäÀ̽º ¶óÀ̺귯¸®¿¡ ÀÇÇØ ÀԷµǴ °ÍÀ» ÁÖÀÇÇϽʽÿä. ¼º°ø ½Ã¿¡´Â 1, ½ÇÆÐ½Ã¿¡´Â ¡ª1ÀÌ ¹ÝȯµË´Ï´Ù.
Àаųª ÀÔ·ÂÀ» À§ÇØ ±âÁ¸ÀÇ large object¸¦ ¿©´Â °æ¿ì´Â, ÀÌÇÏÀÇ ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù.
int lo_open(PGconn *conn, Oid lobjId, int mode);
lobjIdÀÎÀÚ´Â ¿°í ½ÍÀº large objectÀÇ OID¸¦ ÁöÁ¤ÇÕ´Ï´Ù.
modeÀÇ °¢ ºñÆ®´Â, ¿ÀºêÁ§Æ®¸¦ Àбâ(INV_READ), ÀÔ·Â(INV_WRITE) ¶Ç´Â ±× µÑÀ» À§ÇÑ ¿ÀÇ ¿©ºÎ¸¦ Á¦¾îÇÕ´Ï´Ù.
(ÀÌ·¯ÇÑ »ó¡Àû »ó¼ö´Â libpq/libpq-fs.h header ÆÄÀÏ ³»¿¡¼ Á¤Àǵǰí ÀÖ½À´Ï´Ù.)
»ý¼ºµÇÁö ¾ÊÀº large object´Â ¿ ¼ö ¾ø½À´Ï´Ù.
lo_open´Â lo_read,lo_write,lo_lseek,lo_tell,lo_close·Î »ç¿ëÇÏ´Â(ºñºÎÀÇ) large object ±â¼ú¾î¸¦ ¸®ÅÏÇÕ´Ï´Ù.
ÀÌ ±â¼ú¾î´Â ÇöÀçÀÇ Æ®·£Àè¼Ç(transaction) ±â°£¿¡¸¸ À¯È¿ÇÕ´Ï´Ù.
½ÇÆÐ½Ã¿¡´Â -1ÀÌ µ¹·ÁÁÖ¾îÁý´Ï´Ù.
Çö½ÃÁ¡¿¡¼´Â ¼¹ö´ÂINV_WRITE¸ðµå,INV_READ | INV_WRITE¸ðµå¸¦ ±¸º°ÇÏÁö ¾Ê½À´Ï´Ù.
µÎ °æ¿ì ¸ðµÎ ±â¼ú¾î·Î¸¦ »ç¿ëÇØ¾ß ÀÐÀ» ¼ö ÀÖ½À´Ï´Ù.
±×·¯³ª ÀÌ·¯ÇÑ ¸ðµå¿Í INV_READ¸ðµå Çϳª »çÀÌ¿¡´Â ¸í¹éÇÑ Â÷À̰¡ Á¸ÀçÇÕ´Ï´Ù.
INV_READ¸ðµå¿¡¼´Â ±â¼ú¾î¿¡ ÀÔ·ÂÀ» ÇÒ ¼ö ¾ø½À´Ï´Ù.
±×¸®°í ÀоîµéÀÎ µ¥ÀÌÅÍ´Â Æ®·£Àè¼Ç(transaction)À̳ª ´Ù¸¥ Æ®·£Àè¼Ç(transaction)¿¡ ÀÇÇØ ÀÔ·ÂµÈ ´ÙÀ½ÀÎÁö¿Í °ü°è¾øÀÌ
lo_open¸¦ ½ÇÇàÇßÀ» ¶§ À¯È¿Çß´ø Æ®·£Àè¼Ç(transaction) snapshot ½ÃÁ¡ÀÇ large objectÀÇ ³»¿ëÀ» ¹Ý¿µÇÒ °ÍÀÔ´Ï´Ù.]
INV_WRITE¸¦ °¡Áø ¿ÀÇÂµÈ ±â¼ú¾î·ÎºÎÅÍ Àо¸é, ÇöÀçÀÇ Æ®·£Àè¼Ç(transaction)¿¡ ÀÇÇÑ ÀÔ·ÂÀ̳ª ´Ù¸¥ ó¸®µÈ Æ®·£Àè¼Ç(transaction)ÀÇ ¸ðµç ÀÔ·ÂÀ» ¹Ý¿µÇÑ µ¥ÀÌÅͰ¡ ¸®Åϵ˴ϴÙ.
À̰ÍÀº º¸ÅëÀÇ SELECT SQL Ä¿¸àµå¸¦ À§ÇÑ SERIALIZABLE°ú READ COMMITTEDÆ®·£Àè¼Ç(transaction)ÀÇ µ¿ÀÛÀÇ Â÷ÀÌ¿Í ºñ½ÁÇÕ´Ï´Ù.
ÀÌÇÏ¿¡ ¿¹¸¦ ³ªÅ¸³À´Ï´Ù.
inv_fd = lo_open(conn, inv_oid, INV_READ|INV_WRITE);
int lo_write(PGconn *conn, int fd, const char *buf, size_t len);
´Â buf·ÎºÎÅÍ len¹ÙÀÌÆ®¸¦ fd large object ±â¼ú¾î¿¡ ÀԷµȴÙ.
fdÀÎÀÚ´Â »çÀü¿¡ ½ÇÇàÇÑ lo_openÀÇ ¹Ýȯ°ªÀÌ ¾Æ´Ï¸é ¾ÈµË´Ï´Ù.
½ÇÁ¦·Î ÀÔ·ÂµÈ ¹ÙÀÌÆ® ¼ö°¡ µ¹·ÁÁÖ¾îÁý´Ï´Ù.
¿¡·¯°¡ ¹ß»ýÇßÀ» °æ¿ì´Â, À½ÀÇ °ªÀ» µ¹·ÁÁÝ´Ï´Ù.
int lo_read(PGconn *conn, int fd, char *buf, size_t len);
ÇÔ¼ö´Â len ¹ÙÀÌÆ®¸¦ fd large object ±â¼ú¾î·ÎºÎÅÍ buf¿¡ ÀоîµéÀÔ´Ï´Ù.
fdÀÎÀÚ´Â »çÀü¿¡ ½ÇÇàÇÑ lo_openÀÇ ¹Ýȯ°ªÀÌ ¾Æ´Ï¸é ¾ÈµË´Ï´Ù.
½ÇÁ¦·Î ÀÐ¾î µéÀÎ ¹ÙÀÌÆ® ¼ö°¡ µ¹·ÁÁÖ¾îÁý´Ï´Ù.
¿¡·¯°¡ ¹ß»ýÇßÀ» °æ¿ì´Â, À½ÀÇ °ªÀ» µ¹·ÁÁÝ´Ï´Ù.
large object ±â¼ú¾î¿Í °ü·ÃµÈ ÇöÀç ÀоîµéÀ̰ųª ÀÔ·ÂÇÏ´Â À§Ä¡¸¦ º¯°æÇϱâ À§Çؼ, ´ÙÀ½ÀÇ ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù.
int lo_lseek(PGconn *conn, int fd, int offset, int whence);
ÇÔ¼ö´Â fd·Î ½Äº°µÇ´Â large object ±â¼ú¾îÀÇ ÇöÀç À§Ä¡¸¦ °¡¸®Å°´Â Æ÷ÀÎÅ͸¦, offset·Î ÁöÁ¤µÈ »õ·Î¿î À§Ä¡·Î º¯°æ½Ãŵ´Ï´Ù. whence·Î ÁöÁ¤ °¡´ÉÇÑ °ªÀº, SEEK_SET(¿ÀºêÁ§Æ® ½ÃÀÛºÎÅÍ °Ë»ö), SEEK_CUR(ÇöÀç À§Ä¡ºÎÅÍ °Ë»ö), SEEK_END(¿ÀºêÁ§Æ® ¾Æ·¡ºÎÅÍ °Ë»ö)ÀÔ´Ï´Ù. ¹Ýȯ°ªÀº »õ·Î¿î À§Ä¡ Æ÷ÀÎÅÍ·Î, ¿¡·¯ ½Ã¿¡ -1ÀÌ µ¹·ÁÁÖ¾îÁý´Ï´Ù.
Large Object ±â¼ú¾îÀÇ ÀÐÇôÁö°í ÀԷµǴ ÇöÀç À§Ä¡¸¦ ¾ò±â À§Çؼ, ÀÌÇÏÀÇ ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù.
int lo_tell(PGconn *conn, int fd);
ÀÌÇϸ¦ È£ÃâÇÏ´Â °ÍÀ¸·Î large object ±â¼ú¾î¸¦ Á¾·áÇÒ ¼ö ÀÖ½À´Ï´Ù.
int lo_close(PGconn *conn, int fd);
¿©±â¼, fd´Â lo_openÀÇ ¹Ýȯ°ªÀÎ large object ±â¼ú¾îÀÔ´Ï´Ù.
¼º°øÇϸé lo_close´Â 0À» µ¹·ÁÁÝ´Ï´Ù.
½ÇÆÐÇϸé À½ÀÇ °ªÀ» µ¹·ÁÁÝ´Ï´Ù.
¿ÀÇÂµÈ »óÅÂÀÎ large object ±â¼ú¾î´Â ¸ðµÎ Æ®·£Àè¼Ç(transaction)ÀÇ Á¾·á ½Ã¿¡ ÀÚµ¿ÀûÀ¸·Î ´ÝÈü´Ï´Ù.
µ¥ÀÌÅͺ£À̽º·ÎºÎÅÍ Large Object¸¦ »èÁ¦ÇÏ·Á¸é, ÀÌÇÏÀÇ ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù.
int lo_unlink(PGconn *conn, Oid lobjId);
lobjIdÀÎÀÚ´Â »èÁ¦ÇÏ´Â large objectÀÇ OID¸¦ ÁöÁ¤ÇÕ´Ï´Ù. ¼º°ø½Ã¿¡ 1À», ½ÇÆÐ½Ã¿¡ -1À» µ¹·ÁÁÝ´Ï´Ù.