27.8. ��COPY������صĺ���

PostgreSQL ��� COPY ������������ libpq ����������Ӷ�������д���ѡ� ���������ĺ�������Ӧ��ͨ���ṩ�������Ŀ������ݣ��������������ܡ�

����������Ӧ������ͨ�� PQexec ����һ����Ч�ĺ������� SQL COPY ��� ������������Ӧ������������󣩽���һ������״̬�� PGRES_COPY_OUT ���� PGRES_COPY_IN �� PGresult��������������Ŀ������򣩡� Ӧ��Ȼ���Ӧ��ʹ�ñ��ڵĺ������ܻ��߷��������С������ݴ������֮�󣬷�������һ�� PGresult �����Ա�������ijɹ�����ʧ�ܡ�����״̬���� PGRES_COMMAND_OK ��ʾ�ɹ����� ���������һЩ���⣬�� PGRES_FATAL_ERROR�� ���ʱ��ʼ���ǿ���ͨ�� PQexec �������� SQL ��� ���� COPY �����ڴ���Ĺ����У����Dz�������ͬһ������ִ������ SQL ���

���һ�� COPY ��ͨ�� PQexec ��һ�����԰�������������ִ��﷢���ģ� ��ôӦ������� COPY ����֮���������� PQgetResult ץȡ����� ֻ���� PQgetResult ���� NULL ��ʱ�����Dz���ȷ�� PQexec �������ִ��Ѿ�������ϣ������Ѿ����԰�ȫ�ط����������

���ڵ���Щ����Ӧ��ֻ�ڴ� PQexec �� PQgetResult ����� PGRES_COPY_OUT �� PGRES_COPY_IN ���״̬�������ִ�С�

һ����������Щ״ֵ̬֮һ�� PGresult ����������ijЩ�й����ڿ�ʼ�� COPY �����Ķ�����Ϣ����Щ��������ݿ�������ЩͬʱҲ�����ѯ ����ĺ�����ȡ��

PQnfields

����Ҫ�������ֶΣ������򣩸�����

PQbinaryTuples

0 ��ʾȫ��������ʽ�����ı��ģ���֮���û��зָ����ֶ��÷ָ����ָ����ȵȣ��� 1 ��ʾȫ��������ʽ���Ƕ����ơ����� COPY ��ȡ������Ϣ��

PQfformat

���غͿ���������ÿ���ֶ���صĸ�ʽ���루0 ���ı���1 �Ƕ����ƣ��� ���ȫ��������ʽ���ı�����ôÿ�ֶεĸ�ʽ�뽫�����㣬���ǣ����壩�����Ƹ�ʽ����֧���ı��Ͷ������ֶβ��档 ����������Ŀǰ�� COPY ʵ�֣��ڶ����ƿ�����ֻ���ֶ������ֶΣ� ����Ŀǰÿ�ֶεĸ�ʽ����ƥ�������ʽ����

ע��: ��Щ���������ֵֻ����ʹ�� 3.0 �汾��Э���ʱ���á���ʹ�� 2.0 �汾��Э��ʱ��������Щ���������� 0��

27.8.1. ���ڷ��� COPY ���ݵĺ���

��Щ���������� COPY FROM STDIN �����з������ݡ� ��������Ӳ��Ǵ��� COPY_IN ״̬�£����ǻ�ʧ�ܡ�

PQputCopyData

�� COPY_IN ״̬�ڼ���������������ݡ�

int PQputCopyData(PGconn *conn,
                  const char *buffer,
                  int nbytes);

����ָ���� buffer ��ģ�����Ϊ nbytes �� COPY ���ݵ��������� ������ݷ��ͳɹ�������� 1�������Ϊ������ͼ���������������ֻ���������Ƿ�����ģʽʱ���п��ܣ���û�гɹ��� ��ô���㣬�������ڷ��������ʱ���� -1����������� -1����ôʹ�� PQerrorMessage ����ϸ�ڡ� ���ֵ���㣬��ô�ȴ�д׼����Ȼ�����ԡ���

Ӧ�ÿ��԰� COPY �������ָ���������ʵĴ�С�ŵ�������� �ڷ��͵�ʱ�򣬻������ı߽�û��ʲô��������⡣�����������ݱ���ƥ�� COPY ����Ԥ�ڵ����ݸ�ʽ�� ���� COPY ��ȡϸ�ڡ�

PQputCopyEnd

�� COPY_IN ״̬�������������������ϵ�ָʾ��

int PQputCopyEnd(PGconn *conn,
                 const char *errormsg);

��� errormsg �� NULL����ɹ����� COPY_IN ������ ��� errormsg ���� NULL �� COPY ������ǿ��ʧ�ܣ� errormsg ָ����ִ��Ǵ�����Ϣ�������Dz�����Ϊͬ������Ϣ���ܻ�ӷ��������أ� ��Ϊ�����������Ѿ���Ϊ�Լ���ԭ���� COPY ʧ�ܡ���Ҫע�������ʹ�� 3.0 �汾֮ǰ��Э������ʱ�� ǿ��ʧ�ܵ�ѡ���Dz����õġ���

�����ֹ���ݷ��ͣ�����Ϊ 1�����������ͼ��������ֻ�����������ڷ�����ģʽ������²ſ��ܳ������������� ��Ϊ�㣬������������򷵻� -1�����������ֵ�� -1���� PQerrorMessage ����ϸ�ڡ� ���ֵ���㣬��ô�ȴ�д׼����Ȼ�����³��ԡ���

�ڳɹ����� PQputCopyEnd ֮�󣬵��� PQgetResult ��ȡ COPY ��������ս��״̬�� ���ǿ�����ƽ���ķ������ȴ����������á�Ȼ�󷵻ص������IJ�����

27.8.2. ���ڽ��� COPY ���ݵĺ���

��Щ���������� COPY TO STDOUT �Ĺ����м������ݡ� ������Ӳ��� COPY_OUT ״̬����ô���ǽ���ʧ�ܡ�

PQgetCopyData

�� COPY_OUT ״̬�´ӷ������������ݡ�

int PQgetCopyData(PGconn *conn,
                  char **buffer,
                  int async);

��һ�� COPY �Ĺ�������ͼ��ȡ����һ�����ݡ� ��������ÿ�η���һ�������У����ֻ��һ�еIJ��ֿ��ã���ô�����ᱻ���ء� �ɹ�����һ�������а�������һ���ڴ����������Щ���ݡ� buffer ���������Ƿ� NULL�� *buffer ����Ϊָ�����������ڴ��ָ�룬���������û�з��ػ���������ôΪ NULL�� һ����NULL�Ľ���������ڲ�����Ҫ��ʱ������� PQfreemem �ͷš�

�ڳɹ�����һ��֮����ô���ص�ֵ���Ǹ������������ݵ��ֽ�������������Ǵ����㣩�� ���ص��ִ����ǿս�β�ģ���Ȼ����ֻ�Ƕ��ı��� COPY ���á� һ����Ľ����ʾ�� COPY ��Ȼ�ڴ����У����ǻ�û�п����õ��У����ֻ���� async Ϊ���ʱ��ſ��ܣ��� һ�����Ϊ -1 ��ֵ��ʾ COPY �Ѿ����������Ϊ -2 ��ʾ�����˴��󣨲ο� PQerrorMessage ��ȡԭ�򣩡�

�� async Ϊ���ʱ�򣨷��㣩��PQgetCopyData ����������ס�ȴ����룻 ����� COPY ���ڴ�������в���û�п��õ������У���ô���������㡣 ��������������������³���֮ǰ�ȴ���׼���ã��������������Ƿ������ PQconsumeInput���� �� async �Ǽ٣��㣩��ʱ��PQgetCopyData ������ס��֪���п��õ����ݻ��߲�����ɡ�

�� PQgetCopyData ���� -1 ֮�󣬵��� PQgetResult ��ȡ COPY ����������״̬�� ���ǿ�����ͨ���ķ����ȴ����������á�Ȼ�󷵻ص�����������

27.8.3. ���� COPY �ķ����ĺ���

�������Щ������������ǰ�Ĵ��� COPY �ķ����� �������ǻ����ã����������Ѿ������ˣ���Ϊ���ǵĴ�����ʵ����̫����ˣ� ���Ҽ�����ݽ����ķ���Ҳ�ܲ����㣬����ȱ�ٶԶ����ƺη����������֧�֡�

PQgetline

��ȡһ�������з���β���ַ�����ָ���ֽ������ַ����ɷ��������������䣩��һ������Ϊ length ���ַ�����������

int PQgetline(PGconn *conn,
	      char *buffer,
	      int length);

��������������length-1 ���ַ����������Ȼ�����ֹ�����з�ת����һ���ֽ��㡣 PQgetline ���������ʱ���� EOF�� ������ж�����ȡ�˷��� 0����������������˶���û���������������з��򷵻� 1��

ע�⣬Ӧ�ó�������������Ƿ���������ַ� \.�� ������������������Ѿ������ COPY ����Ľ���ķ��͡� ���Ӧ�ÿ����յ�����length-1 �ַ������ַ������Ǿ�Ӧ��ȷ����ȷʶ��\.�� �����磬��Ҫ��һ�������еĽ�������һ����ֹ�У���

PQgetlineAsync

���������ض�ȡһ�� COPY ���ݣ��ɷ��������������䣩��һ���������С�

int PQgetlineAsync(PGconn *conn,
		   char *buffer,
		   int bufsize);

������������� PQgetline�����ǿ���������Щ�����첽�ض�ȡ COPY���ݵ�Ӧ�ã�Ҳ���Dz�������Ӧ�á���ʹ����COPY����ͻ�ȡ�� PGRES_COPY_OUT��Ӧ֮��Ӧ��Ӧ�õ��� PQconsumeInput �� PQgetlineAsync ֱ���յ����ݽ������źš�

����PQgetline������������������ݽ�����

��ÿ�ε���ʱ�����libpq �����뻺�������п��õ�һ�������Ļ��з���β�������У� PQgetlineAsync �����������ݡ� �������������ݵ���֮ǰ���᷵�����ݡ� ��������˿������ݽ����ı�־���˺������� -1�����û�п������ݷ��� 0�� �����Ǹ���һ�������������ص����ݵ��ֽ������������ -1����������һ��������� PQendcopy��Ȼ��ص���������

���ص����ݽ�������һ�еķ�Χ�� ������ܣ�ÿ�ν�����һ�������С�������������ṩ�Ļ�����̫С�� �޷����·��������������У���ô�����ز����С��������ͨ�����Է��ص����һ���ֽ��Ƿ� \n ��ȷ�ϡ� �ڶ����� COPY �У�������Ҫ�� COPY ���ݸ�ʽ����ʵ�ʵķ������Ա�����ͬ���жϡ��� ���ص��ַ������ǿս�β�ġ� ���������õ�һ���ս�β���ִ���ȷ���㴫����һ�� ��ʵ�ʿ��ÿռ���һ�ֽڵ�bufsize����

PQputline

�����������������һ���ս�β���ַ������ɹ�ʱ���� 0��������ܷ����ַ������� EOF��

int PQputline(PGconn *conn,
	      const char *string);

һϵ�� PQputline ���÷��͵� COPY �������� PQgetlineAsync ���ص���������һ���ĸ�ʽ�� ֻ��Ӧ�ò���Ҫ��ȷ����ÿ�� PQputline �����з���һ�������У�����ÿ�ε����﷢�Ͷ��л��߲����ж��ǿ��Եġ�

ע��: �� PostgreSQL 3.0 �汾��Э��֮ǰ��Ӧ�ñ�����ȷ�ط��������ַ� \. ���������� ���߷��������Ѿ���� COPY ���ݵķ��͡���Ȼ��ô����Ȼ��Ч�������Ѿ������ˣ� \. �����⺬������ڽ����İ汾��ɾ�����ڷ�����ʵ������֮�󣬵��� PQendcopy ���㹻�ˡ�

PQputnbytes

�����������������һ���ǿս�β���ַ������ɹ�ʱ���� 0��������ܷ����ַ������� EOF��

int PQputnbytes(PGconn *conn,
		const char *buffer,
		int nbytes);

�˺������� PQputline���������ݻ���������Ҫ�ǿս�β��֮�⣬��ΪҪ���͵��ֽ�����ֱ�������ġ� �ڷ��Ͷ��������ݵ�ʱ��ʹ��������̡�

PQendcopy

�������ͬ����

int PQendcopy(PGconn *conn);

��������ȵ���������ɿ������ŷ��أ����� ��������� PQputline ����������������һ���ַ���������� PGgetline�ӷ�������ȡ���һ���ַ������������ ���DZ���������������������������ܻ��ǰ��"ͬ����ʧ"��������������غ� ���������Ѿ�׼���ý�����һ�� SQL �����ˡ��ɹ�ʱ����0�����򷵻ط���ֵ�� ���������ֵΪ�� 0���� PQerrorMessage ����ϸ�ڡ���

��ʹ�� PQgetResultʱ��Ӧ��Ӧ�ö� PGRES_COPY_OUT �Ľ��������Ӧ���ظ����� PQgetline���������յ�������ʱ���� PQendcopy�� Ȼ��Ӧ�÷��ص� PQgetResult ѭ��ֱ�� PQgetResult ���� NULL�� ���Ƶأ� PGRES_COPY_IN �������һϵ�� PQputline ���������� PQendcopy��Ȼ�󷵻ص� PQgetResult ѭ���� ���������н���֤Ƕ�뵽һϵ�� SQL ������� COPY �������ȷִ�С�

�ɵ�Ӧ�ô��ͨ�� PQexec �ύһ�� COPY ����Ҽ����� PQendcopy ��������ɡ� ����ֻ���� COPY �������ִ����Ψһ�� SQL ����ʱ������ȷ������