/* Set flags for current tracing session */ void
PQsetTraceFlags(PGconn *conn, int flags)
{ if (conn == NULL) return; /* If PQtrace() failed, do nothing. */ if (conn->Pfdebug == NULL) return;
conn->traceFlags = flags;
}
/* *pqTraceOutputNchar:outputastringofexactlylenbytesmessagetothelog * *If'suppress'istrue,printaliteral'BBBB'insteadoftheactualbytes.
*/ staticvoid
pqTraceOutputNchar(FILE *pfdebug, int len, constchar *data, int *cursor, bool suppress)
{ int i,
next; /* first char not yet printed */ constchar *v = data + *cursor;
/* *Inregressmode,suppressthelengthofErrorResponseand *NoticeResponse.TheF(filename),L(linenumber)andR(routine *name)fieldscanchangeasservercodeismodified,andiftheir *lengthsdifferfromtheoriginals,thatwouldbreaktests.
*/ if (regress && !toServer && (id == PqMsg_ErrorResponse || id == PqMsg_NoticeResponse))
fprintf(conn->Pfdebug, "%s\tNN\t", prefix); else
fprintf(conn->Pfdebug, "%s\t%d\t", prefix, length);
switch (id)
{ case PqMsg_ParseComplete:
fprintf(conn->Pfdebug, "ParseComplete"); /* No message content */ break; case PqMsg_BindComplete:
fprintf(conn->Pfdebug, "BindComplete"); /* No message content */ break; case PqMsg_CloseComplete:
fprintf(conn->Pfdebug, "CloseComplete"); /* No message content */ break; case PqMsg_NotificationResponse:
pqTraceOutput_NotificationResponse(conn->Pfdebug, message, &logCursor, regress); break; case PqMsg_Bind:
pqTraceOutput_Bind(conn->Pfdebug, message, &logCursor); break; case PqMsg_CopyDone:
fprintf(conn->Pfdebug, "CopyDone"); /* No message content */ break; case PqMsg_CommandComplete: /* Close(F) and CommandComplete(B) use the same identifier. */
Assert(PqMsg_Close == PqMsg_CommandComplete); if (toServer)
pqTraceOutput_Close(conn->Pfdebug, message, &logCursor); else
pqTraceOutput_CommandComplete(conn->Pfdebug, message, &logCursor); break; case PqMsg_CopyData:
pqTraceOutput_CopyData(conn->Pfdebug, message, &logCursor,
length, regress); break; case PqMsg_Describe: /* Describe(F) and DataRow(B) use the same identifier. */
Assert(PqMsg_Describe == PqMsg_DataRow); if (toServer)
pqTraceOutput_Describe(conn->Pfdebug, message, &logCursor); else
pqTraceOutput_DataRow(conn->Pfdebug, message, &logCursor); break; case PqMsg_Execute: /* Execute(F) and ErrorResponse(B) use the same identifier. */
Assert(PqMsg_Execute == PqMsg_ErrorResponse); if (toServer)
pqTraceOutput_Execute(conn->Pfdebug, message, &logCursor, regress); else
pqTraceOutput_ErrorResponse(conn->Pfdebug, message, &logCursor, regress); break; case PqMsg_CopyFail:
pqTraceOutput_CopyFail(conn->Pfdebug, message, &logCursor); break; case PqMsg_GSSResponse:
Assert(PqMsg_GSSResponse == PqMsg_PasswordMessage);
Assert(PqMsg_GSSResponse == PqMsg_SASLInitialResponse);
Assert(PqMsg_GSSResponse == PqMsg_SASLResponse);
/* *Thesemessagesshareacommontypebyte,sowediscriminateby *havingthecodestoretheauthtypeseparately.
*/ switch (conn->current_auth_response)
{ case AUTH_RESPONSE_GSS:
pqTraceOutput_GSSResponse(conn->Pfdebug, message,
&logCursor, length, regress); break; case AUTH_RESPONSE_PASSWORD:
pqTraceOutput_PasswordMessage(conn->Pfdebug, message,
&logCursor); break; case AUTH_RESPONSE_SASL_INITIAL:
pqTraceOutput_SASLInitialResponse(conn->Pfdebug, message,
&logCursor, regress); break; case AUTH_RESPONSE_SASL:
pqTraceOutput_SASLResponse(conn->Pfdebug, message,
&logCursor, length, regress); break; default:
fprintf(conn->Pfdebug, "UnknownAuthenticationResponse"); break;
}
conn->current_auth_response = '\0'; break; case PqMsg_FunctionCall:
pqTraceOutput_FunctionCall(conn->Pfdebug, message, &logCursor, regress); break; case PqMsg_CopyInResponse:
pqTraceOutput_CopyInResponse(conn->Pfdebug, message, &logCursor); break; case PqMsg_Flush: /* Flush(F) and CopyOutResponse(B) use the same identifier */
Assert(PqMsg_CopyOutResponse == PqMsg_Flush); if (toServer)
fprintf(conn->Pfdebug, "Flush"); /* no message content */ else
pqTraceOutput_CopyOutResponse(conn->Pfdebug, message, &logCursor); break; case PqMsg_EmptyQueryResponse:
fprintf(conn->Pfdebug, "EmptyQueryResponse"); /* No message content */ break; case PqMsg_BackendKeyData:
pqTraceOutput_BackendKeyData(conn->Pfdebug, message, &logCursor, regress); break; case PqMsg_NoData:
fprintf(conn->Pfdebug, "NoData"); /* No message content */ break; case PqMsg_NoticeResponse:
pqTraceOutput_NoticeResponse(conn->Pfdebug, message, &logCursor, regress); break; case PqMsg_Parse:
pqTraceOutput_Parse(conn->Pfdebug, message, &logCursor, regress); break; case PqMsg_Query:
pqTraceOutput_Query(conn->Pfdebug, message, &logCursor); break; case PqMsg_AuthenticationRequest:
pqTraceOutput_Authentication(conn->Pfdebug, message, &logCursor,
length, regress); break; case PqMsg_PortalSuspended:
fprintf(conn->Pfdebug, "PortalSuspended"); /* No message content */ break; case PqMsg_Sync: /* ParameterStatus(B) and Sync(F) use the same identifier */
Assert(PqMsg_ParameterStatus == PqMsg_Sync); if (toServer)
fprintf(conn->Pfdebug, "Sync"); /* no message content */ else
pqTraceOutput_ParameterStatus(conn->Pfdebug, message, &logCursor); break; case PqMsg_ParameterDescription:
pqTraceOutput_ParameterDescription(conn->Pfdebug, message, &logCursor, regress); break; case PqMsg_RowDescription:
pqTraceOutput_RowDescription(conn->Pfdebug, message, &logCursor, regress); break; case PqMsg_NegotiateProtocolVersion:
pqTraceOutput_NegotiateProtocolVersion(conn->Pfdebug, message, &logCursor); break; case PqMsg_FunctionCallResponse:
pqTraceOutput_FunctionCallResponse(conn->Pfdebug, message, &logCursor); break; case PqMsg_CopyBothResponse:
pqTraceOutput_CopyBothResponse(conn->Pfdebug, message, &logCursor, length); break; case PqMsg_Terminate:
fprintf(conn->Pfdebug, "Terminate"); /* No message content */ break; case PqMsg_ReadyForQuery:
pqTraceOutput_ReadyForQuery(conn->Pfdebug, message, &logCursor); break; default:
fprintf(conn->Pfdebug, "Unknown message: %02x", id); break;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.