| 981 | } |
| 982 | |
| 983 | void |
| 984 | HandleFaultMessage(const char* msg) |
| 985 | { |
| 986 | char name[NAMEDATALEN]; |
| 987 | char type[NAMEDATALEN]; |
| 988 | char ddl[NAMEDATALEN]; |
| 989 | char db[NAMEDATALEN]; |
| 990 | char table[NAMEDATALEN]; |
| 991 | char faultInjectModuleName[NAMEDATALEN]; |
| 992 | int start; |
| 993 | int end; |
| 994 | int extra; |
| 995 | int sid; |
| 996 | char *result; |
| 997 | int len; |
| 998 | QueryCompletion qc; |
| 999 | |
| 1000 | qc.commandTag = CMDTAG_FAULT_INJECT; |
| 1001 | qc.nprocessed = 0; |
| 1002 | |
| 1003 | #ifdef USE_INTERNAL_FTS |
| 1004 | int skipFtsProbe; |
| 1005 | if (sscanf(msg, "faultname=%s type=%s ddl=%s db=%s table=%s modulename=%s " |
| 1006 | "start=%d end=%d extra=%d sid=%d skipftsprobe=%d", |
| 1007 | name, type, ddl, db, table, faultInjectModuleName, &start, &end, &extra, &sid, &skipFtsProbe) != 11) |
| 1008 | elog(ERROR, "invalid fault message: %s", msg); |
| 1009 | #else |
| 1010 | if (sscanf(msg, "faultname=%s type=%s ddl=%s db=%s table=%s modulename=%s " |
| 1011 | "start=%d end=%d extra=%d sid=%d", |
| 1012 | name, type, ddl, db, table, faultInjectModuleName, &start, &end, &extra, &sid) != 10) |
| 1013 | elog(ERROR, "invalid fault message: %s", msg); |
| 1014 | #endif |
| 1015 | Assert(strlen(faultInjectModuleName) > 0); |
| 1016 | load_external_function(faultInjectModuleName, name, false, NULL); |
| 1017 | |
| 1018 | /* The value '#' means not specified. */ |
| 1019 | if (ddl[0] == '#') |
| 1020 | ddl[0] = '\0'; |
| 1021 | if (db[0] == '#') |
| 1022 | db[0] = '\0'; |
| 1023 | if (table[0] == '#') |
| 1024 | table[0] = '\0'; |
| 1025 | |
| 1026 | BeginCommand(qc.commandTag, DestRemote); |
| 1027 | |
| 1028 | result = InjectFault(name, type, ddl, db, table, start, end, extra, sid); |
| 1029 | len = strlen(result); |
| 1030 | |
| 1031 | StringInfoData buf; |
| 1032 | pq_beginmessage(&buf, 'T'); |
| 1033 | pq_sendint(&buf, Natts_fault_message_response, 2); |
| 1034 | |
| 1035 | pq_sendstring(&buf, "status"); |
| 1036 | pq_sendint(&buf, 0, 4); /* table oid */ |
| 1037 | pq_sendint(&buf, Anum_fault_message_response_status, 2); /* attnum */ |
| 1038 | pq_sendint(&buf, TEXTOID, 4); /* type oid */ |
| 1039 | pq_sendint(&buf, -1, 2); /* typlen */ |
| 1040 | pq_sendint(&buf, -1, 4); /* typmod */ |
no test coverage detected