| 4568 | |
| 4569 | |
| 4570 | dsc* evlGetContext(thread_db* tdbb, const SysFunction*, const NestValueArray& args, |
| 4571 | impure_value* impure) |
| 4572 | { |
| 4573 | fb_assert(args.getCount() == 2); |
| 4574 | |
| 4575 | Jrd::Attachment* attachment = tdbb->getAttachment(); |
| 4576 | Database* dbb = tdbb->getDatabase(); |
| 4577 | jrd_tra* transaction = tdbb->getTransaction(); |
| 4578 | Request* request = tdbb->getRequest(); |
| 4579 | |
| 4580 | request->req_flags &= ~req_null; |
| 4581 | const dsc* nameSpace = EVL_expr(tdbb, request, args[0]); |
| 4582 | if (request->req_flags & req_null) // Complain if namespace is null |
| 4583 | ERR_post(Arg::Gds(isc_ctx_bad_argument) << Arg::Str(RDB_GET_CONTEXT)); |
| 4584 | |
| 4585 | const dsc* name = EVL_expr(tdbb, request, args[1]); |
| 4586 | if (request->req_flags & req_null) // Complain if variable name is null |
| 4587 | ERR_post(Arg::Gds(isc_ctx_bad_argument) << Arg::Str(RDB_GET_CONTEXT)); |
| 4588 | |
| 4589 | const string nameSpaceStr(MOV_make_string2(tdbb, nameSpace, ttype_none)); |
| 4590 | const string nameStr(MOV_make_string2(tdbb, name, ttype_none)); |
| 4591 | |
| 4592 | string resultStr; |
| 4593 | USHORT resultType = ttype_none; |
| 4594 | request->req_flags |= req_null; |
| 4595 | |
| 4596 | if (nameSpaceStr == SYSTEM_NAMESPACE) // Handle system variables |
| 4597 | { |
| 4598 | if (nameStr == ENGINE_VERSION) |
| 4599 | resultStr.printf("%s.%s.%s", FB_MAJOR_VER, FB_MINOR_VER, FB_REV_NO); |
| 4600 | else if (nameStr == DATABASE_NAME) |
| 4601 | resultStr = dbb->dbb_database_name.ToString(); |
| 4602 | else if (nameStr == DATABASE_GUID) |
| 4603 | { |
| 4604 | char guidBuffer[GUID_BUFF_SIZE]; |
| 4605 | GuidToString(guidBuffer, &dbb->dbb_guid); |
| 4606 | resultStr = string(guidBuffer); |
| 4607 | } |
| 4608 | else if (nameStr == DATABASE_FILE_ID) |
| 4609 | { |
| 4610 | resultStr = dbb->getUniqueFileId(); |
| 4611 | } |
| 4612 | else if (nameStr == REPLICA_MODE) |
| 4613 | { |
| 4614 | if (dbb->dbb_replica_mode == REPLICA_READ_ONLY) |
| 4615 | resultStr = RO_VALUE; |
| 4616 | else if (dbb->dbb_replica_mode == REPLICA_READ_WRITE) |
| 4617 | resultStr = RW_VALUE; |
| 4618 | else |
| 4619 | { |
| 4620 | fb_assert(dbb->dbb_replica_mode == REPLICA_NONE); |
| 4621 | return NULL; |
| 4622 | } |
| 4623 | } |
| 4624 | else if (nameStr == SESSION_ID_NAME) |
| 4625 | resultStr.printf("%" SQUADFORMAT, PAG_attachment_id(tdbb)); |
| 4626 | else if (nameStr == NETWORK_PROTOCOL_NAME) |
| 4627 | { |
nothing calls this directly
no test coverage detected