PostgreSQL 8.0.0 �����ĵ���PostgreSQL �й� ������ | ||||
---|---|---|---|---|
Prev | Fast Backward | Chapter 27. libpq - C �� | Fast Forward | Next |
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 �����Ķ�����Ϣ����Щ��������ݿ�������ЩͬʱҲ�����ѯ ����ĺ�����ȡ��
����Ҫ�������ֶΣ�����������
0 ��ʾȫ��������ʽ�����ı��ģ���֮���û��зָ����ֶ��÷ָ����ָ����ȵȣ��� 1 ��ʾȫ��������ʽ���Ƕ����ơ����� COPY ��ȡ������Ϣ��
���غͿ���������ÿ���ֶ���صĸ�ʽ���루0 ���ı���1 �Ƕ����ƣ��� ���ȫ��������ʽ���ı�����ôÿ�ֶεĸ�ʽ�뽫�����㣬���ǣ����壩�����Ƹ�ʽ����֧���ı��Ͷ������ֶβ��档 ����������Ŀǰ�� COPY ʵ�֣��ڶ����ƿ�����ֻ���ֶ������ֶΣ� ����Ŀǰÿ�ֶεĸ�ʽ����ƥ�������ʽ����
ע��: ��Щ���������ֵֻ����ʹ�� 3.0 �汾��Э���ʱ���á���ʹ�� 2.0 �汾��Э��ʱ��������Щ���������� 0��
��Щ���������� COPY FROM STDIN �����з������ݡ� ��������Ӳ��Ǵ��� COPY_IN ״̬�£����ǻ�ʧ�ܡ�
�� COPY_IN ״̬�ڼ���������������ݡ�
int PQputCopyData(PGconn *conn, const char *buffer, int nbytes);
����ָ���� buffer ��ģ�����Ϊ nbytes �� COPY ���ݵ��������� ������ݷ��ͳɹ�������� 1�������Ϊ������ͼ���������������ֻ���������Ƿ�����ģʽʱ���п��ܣ���û�гɹ��� ��ô���㣬�������ڷ��������ʱ���� -1����������� -1����ôʹ�� PQerrorMessage ����ϸ�ڡ� ���ֵ���㣬��ô�ȴ�д����Ȼ�����ԡ���
Ӧ�ÿ��� COPY �������ָ���������ʵĴ�С�ŵ�������� �ڷ��͵�ʱ�������ı߽�û��ʲô��������⡣�����������ݱ���ƥ�� COPY ����Ԥ�ڵ����ݸ�ʽ�� ���� COPY ��ȡϸ�ڡ�
�� 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�����
��Щ���������� COPY TO STDOUT �Ĺ����м������ݡ� ������Ӳ��� COPY_OUT ״̬����ô���ǽ���ʧ�ܡ�
�� 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 ����������״̬�� ���ǿ�����ͨ���ķ����ȴ����������á�Ȼ�ص�����������
�������Щ������������ǰ�Ĵ��� COPY �ķ����� �������ǻ����ã����������Ѿ������ˣ���Ϊ���ǵĴ�����ʵ����̫����ˣ� ���Ҽ�����ݽ����ķ���Ҳ�ܲ����㣬����ȱ�ٶԶ����ƺη����������֧�֡�
��ȡһ�������з���β���ַ�����ָ���ֽ������ַ����ɷ��������������䣩��һ������Ϊ length ���ַ�����������
int PQgetline(PGconn *conn, char *buffer, int length);
��������������length-1 ���ַ����������Ȼ�����ֹ�����з�ת����һ���ֽ��㡣 PQgetline ���������ʱ���� EOF�� ������ж�����ȡ�˷��� 0����������������˶���û���������������з��� 1��
ע�⣬Ӧ�ó�������������Ƿ���������ַ� \.�� ������������������Ѿ������ COPY ����Ľ���ķ��͡� ���Ӧ�ÿ����յ�����length-1 �ַ������ַ������Ǿ�Ӧ��ȷ����ȷʶ��\.�� �����磬��Ҫ��һ�������еĽ�������һ����ֹ�У���
���������ض�ȡһ�� 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����
�����������������һ���ս�β���ַ������ɹ�ʱ���� 0��������ܷ����ַ������� EOF��
int PQputline(PGconn *conn, const char *string);
һϵ�� PQputline ���÷��͵� COPY �������� PQgetlineAsync ���ص���������һ���ĸ�ʽ�� ֻ��Ӧ�ò���Ҫ��ȷ����ÿ�� PQputline �����з���һ�������У�����ÿ�ε�����Ͷ��л��߲����ж��ǿ��Եġ�
ע��: �� PostgreSQL 3.0 �汾��Э��֮ǰ��Ӧ�ñ�����ȷ�ط��������ַ� \. ���������� ���߷��������Ѿ���� COPY ���ݵķ��͡���Ȼ��ô����Ȼ��Ч�������Ѿ������ˣ� \. �����⺬������ڽ����İ汾��ɾ�����ڷ�����ʵ������֮���� PQendcopy ���㹻�ˡ�
�����������������һ���ǿս�β���ַ������ɹ�ʱ���� 0��������ܷ����ַ������� EOF��
int PQputnbytes(PGconn *conn, const char *buffer, int nbytes);
�˺������� PQputline���������ݻ���������Ҫ�ǿս�β��֮�⣬��ΪҪ���͵��ֽ�����ֱ�������ġ� �ڷ��Ͷ��������ݵ�ʱ��ʹ��������̡�
�������ͬ����
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 ����ʱ������ȷ������