| 1525 | } |
| 1526 | |
| 1527 | StringVal StringFunctions::Base64Encode(FunctionContext* ctx, const StringVal& str) { |
| 1528 | if (str.is_null) return StringVal::null(); |
| 1529 | if (str.len == 0) return StringVal(ctx, 0); |
| 1530 | int64_t out_max = 0; |
| 1531 | if (UNLIKELY(!Base64EncodeBufLen(str.len, &out_max))) { |
| 1532 | stringstream ss; |
| 1533 | ss << "Could not base64 encode a string of length " << str.len; |
| 1534 | ctx->AddWarning(ss.str().c_str()); |
| 1535 | return StringVal::null(); |
| 1536 | } |
| 1537 | StringVal result(ctx, out_max); |
| 1538 | if (UNLIKELY(result.is_null)) return result; |
| 1539 | unsigned out_len = 0; |
| 1540 | if (UNLIKELY(!impala::Base64Encode( |
| 1541 | reinterpret_cast<const char*>(str.ptr), str.len, |
| 1542 | out_max, reinterpret_cast<char*>(result.ptr), &out_len))) { |
| 1543 | stringstream ss; |
| 1544 | ss << "Could not base64 encode input in space " << out_max |
| 1545 | << "; actual output length " << out_len; |
| 1546 | ctx->AddWarning(ss.str().c_str()); |
| 1547 | return StringVal::null(); |
| 1548 | } |
| 1549 | result.len = out_len; |
| 1550 | return result; |
| 1551 | } |
| 1552 | |
| 1553 | StringVal StringFunctions::Base64Decode(FunctionContext* ctx, const StringVal& str) { |
| 1554 | if (str.is_null) return StringVal::null(); |
nothing calls this directly
no test coverage detected