ヘッダーを掘り下げると、次の場所にありますserver/c.h
。
/* ----------------
* Variable-length datatypes all share the 'struct varlena' header.
*...
*/
struct varlena
{
char vl_len_[4]; /* Do not touch this field directly! */
char vl_dat[1];
};
#define VARHDRSZ ((int32) sizeof(int32))
/*
* These widely-used datatypes are just a varlena header and the data bytes.
* There is no terminating null or anything like that --- the data length is
* always VARSIZE(ptr) - VARHDRSZ.
*/
typedef struct varlena bytea;
typedef struct varlena text;
text
したがって、データ型の定義があります。コメントのこのかなり重要な部分に注意してください:
nullなどを終了することはありません
fileName->data
これは、 segfaultsが好きでない限り、C文字列として扱いたくないことを示しています。text
に渡すことができるヌル文字で終了するC文字列に変換する方法が必要stat
です。そのための関数があります:text_to_cstring
。
text_to_cstring
私が見つけることができる唯一のドキュメントは、ソースのこのコメントです:
/*
* text_to_cstring
*
* Create a palloc'd, null-terminated C string from a text value.
*
* We support being passed a compressed or toasted text value.
* This is a bit bogus since such values shouldn't really be referred to as
* "text *", but it seems useful for robustness. If we didn't handle that
* case here, we'd need another routine that did, anyway.
*/
それを使用する例もあります:
char *command;
/*...*/
/* Convert given text object to a C string */
command = text_to_cstring(sql);
/*...*/
pfree(command);
あなたはこのようなことをすることができるはずです:
struct stat buf;
char *fileName = text_to_cstring(PG_GETARG_TEXT_P(0));
int i = stat(fileName, &buf);
pfree(fileName);