30.3. Ŭ¶óÀÌ¾ðÆ® ÀÎÅÍÆäÀ̽º

º» Àý¿¡¼­´Â PostgreSQLŬ¶óÀÌ¾ðÆ® ÀÎÅÍÆäÀ̽º ¶óÀ̺귯¸®¿¡¼­ Á¦°øµÇ´Â large object¿¡ °üÇÑ ±â´ÉÀ» ¼³¸íÇÕ´Ï´Ù. ÇÔ¼ö¸¦ »ç¿ëÇÑ large objectÀÇ ¸ðµç Á¶ÀÛÀº SQL Æ®·£Àè¼Ç(transaction) ºí·Ï ³»¿¡¼­ ÇàÇØÁöÁö ¾ÊÀ¸¸é ¾ÈµË´Ï´Ù . PostgreSQL large object ÀÎÅÍÆäÀ̽º´Â Unix ÆÄÀÏ ½Ã½ºÅÛ ÀÎÅÍÆäÀ̽º¿Í ¿¬°üµÇ¾î ¼³°èµÇ°í ÀÖ¾î open, read, write, lseek µî °°Àº ÀÎÅÍÆäÀ̽º¸¦ °¡Áö°í ÀÖ½À´Ï´Ù.

libpqÀÇ large object ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇϴ Ŭ¶óÀÌ¾ðÆ® ¾îÇø®ÄÉÀ̼ÇÀº libpq/libpq-fs.h header ÆÄÀÏÀ» Æ÷ÇÔÇØ¼­ libpq¶óÀ̺귯¸®¿Í ¸µÅ©ÇØ¾ß ÇÕ´Ï´Ù.

30.3.1. Large Object »ý¼º

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);

30.3.2. Large Object Importing

operating system ÆÄÀÏÀ» large object·Î importÇÏ·Á¸é, ÀÌÇÏÀÇ ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù.

Oid lo_import(PGconn *conn, const char *filename);

filename ´Â large object·Î¼­ importµÇ´Â ÆÄÀÏÀÇ operating system À̸§À» ÁöÁ¤ÇÕ´Ï´Ù. ¸®ÅÏ °ªÀº »õ·Î¿î large objec¿¡ ÇÒ´çµÈ OIDÀÔ´Ï´Ù. ½ÇÆÐ ½Ã´Â InvalidOid(0)°¡ ¹ÝȯµË´Ï´Ù. ÆÄÀÏÀÌ ¼­¹ö´Â ¾Æ´Ï°í, Ŭ¶óÀÌ¾ðÆ® ÀÎÅÍÆäÀ̽º ¶óÀ̺귯¸®·ÎºÎÅÍ ÀÐÇôÁö´Â Áö ÁÖÀÇÇϽʽÿä. Áï, ÀÌ ÆÄÀÏÀº Ŭ¶óÀÌ¾ðÆ® ÆÄÀÏ ½Ã½ºÅÛ¿¡ ÀÖ¾î¾ß¸¸Çϰí, Ŭ¶óÀÌ¾ðÆ® ¾îÇø®ÄÉÀ̼ÇÀ¸·ÎºÎÅÍ ÀоîÁú ¼ö ÀÖ½À´Ï´Ù.

30.3.3. Large Object export

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ÀÌ ¹ÝȯµË´Ï´Ù.

30.3.4. ±âÁ¸ Large Object ¿ÀÇÂ

Àаųª ÀÔ·ÂÀ» À§ÇØ ±âÁ¸ÀÇ 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);

30.3.5. Large ObjectÀÇ µ¥ÀÌÅÍ ÀÔ·Â

int lo_write(PGconn *conn, int fd, const char *buf, size_t len);

´Â buf·ÎºÎÅÍ len¹ÙÀÌÆ®¸¦ fd large object ±â¼ú¾î¿¡ ÀԷµȴÙ. fdÀÎÀÚ´Â »çÀü¿¡ ½ÇÇàÇÑ lo_openÀÇ ¹Ýȯ°ªÀÌ ¾Æ´Ï¸é ¾ÈµË´Ï´Ù. ½ÇÁ¦·Î ÀÔ·ÂµÈ ¹ÙÀÌÆ® ¼ö°¡ µ¹·ÁÁÖ¾îÁý´Ï´Ù. ¿¡·¯°¡ ¹ß»ýÇßÀ» °æ¿ì´Â, À½ÀÇ °ªÀ» µ¹·ÁÁÝ´Ï´Ù.

30.3.6. Large Object·ÎºÎÅÍÀÇ µ¥ÀÌÅÍ Àбâ

int lo_read(PGconn *conn, int fd, char *buf, size_t len);

ÇÔ¼ö´Â len ¹ÙÀÌÆ®¸¦ fd large object ±â¼ú¾î·ÎºÎÅÍ buf¿¡ ÀоîµéÀÔ´Ï´Ù. fdÀÎÀÚ´Â »çÀü¿¡ ½ÇÇàÇÑ lo_openÀÇ ¹Ýȯ°ªÀÌ ¾Æ´Ï¸é ¾ÈµË´Ï´Ù. ½ÇÁ¦·Î ÀÐ¾î µéÀÎ ¹ÙÀÌÆ® ¼ö°¡ µ¹·ÁÁÖ¾îÁý´Ï´Ù. ¿¡·¯°¡ ¹ß»ýÇßÀ» °æ¿ì´Â, À½ÀÇ °ªÀ» µ¹·ÁÁÝ´Ï´Ù.

30.3.7. large object Ž»ö

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ÀÌ µ¹·ÁÁÖ¾îÁý´Ï´Ù.

30.3.8. Large Object Ž»ö À§Ä¡ ¾ò±â

Large Object ±â¼ú¾îÀÇ ÀÐÇôÁö°í ÀԷµǴ ÇöÀç À§Ä¡¸¦ ¾ò±â À§Çؼ­, ÀÌÇÏÀÇ ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù.

int lo_tell(PGconn *conn, int fd);

¿¡·¯°¡ ¹ß»ýÇßÀ» °æ¿ì´Â À½ÀÇ °ªÀÌ ¹ÝȯµË´Ï´Ù.

30.3.9. Large Object ±â¼ú¾î Á¾·á

ÀÌÇϸ¦ È£ÃâÇÏ´Â °ÍÀ¸·Î large object ±â¼ú¾î¸¦ Á¾·áÇÒ ¼ö ÀÖ½À´Ï´Ù.

int lo_close(PGconn *conn, int fd);

¿©±â¼­, fd´Â lo_openÀÇ ¹Ýȯ°ªÀÎ large object ±â¼ú¾îÀÔ´Ï´Ù. ¼º°øÇϸé lo_close´Â 0À» µ¹·ÁÁÝ´Ï´Ù. ½ÇÆÐÇϸé À½ÀÇ °ªÀ» µ¹·ÁÁÝ´Ï´Ù.

¿ÀÇÂµÈ »óÅÂÀÎ large object ±â¼ú¾î´Â ¸ðµÎ Æ®·£Àè¼Ç(transaction)ÀÇ Á¾·á ½Ã¿¡ ÀÚµ¿ÀûÀ¸·Î ´ÝÈü´Ï´Ù.

30.3.10. Large Object »èÁ¦

µ¥ÀÌÅͺ£À̽º·ÎºÎÅÍ Large Object¸¦ »èÁ¦ÇÏ·Á¸é, ÀÌÇÏÀÇ ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù.

int lo_unlink(PGconn *conn, Oid lobjId);

lobjIdÀÎÀÚ´Â »èÁ¦ÇÏ´Â large objectÀÇ OID¸¦ ÁöÁ¤ÇÕ´Ï´Ù. ¼º°ø½Ã¿¡ 1À», ½ÇÆÐ½Ã¿¡ -1À» µ¹·ÁÁÝ´Ï´Ù.