plugin.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include "plugin.h"
  2. #include "interface.h"
  3. #include <yt/yql/plugin/plugin.h>
  4. #include <util/system/dynlib.h>
  5. #include <vector>
  6. #include <optional>
  7. namespace NYT::NYqlPlugin {
  8. namespace NBridge {
  9. ////////////////////////////////////////////////////////////////////////////////
  10. class TDynamicYqlPlugin
  11. {
  12. public:
  13. TDynamicYqlPlugin(std::optional<TString> yqlPluginSharedLibrary)
  14. {
  15. const TString DefaultYqlPluginLibraryName = "./libyqlplugin.so";
  16. auto sharedLibraryPath = yqlPluginSharedLibrary.value_or(DefaultYqlPluginLibraryName);
  17. Library_.Open(sharedLibraryPath.data());
  18. #define XX(function) function = reinterpret_cast<TFunc ## function*>(Library_.Sym(#function));
  19. FOR_EACH_BRIDGE_INTERFACE_FUNCTION(XX);
  20. #undef XX
  21. }
  22. protected:
  23. #define XX(function) TFunc ## function* function;
  24. FOR_EACH_BRIDGE_INTERFACE_FUNCTION(XX)
  25. #undef XX
  26. TDynamicLibrary Library_;
  27. };
  28. ////////////////////////////////////////////////////////////////////////////////
  29. class TYqlPlugin
  30. : public TDynamicYqlPlugin
  31. , public IYqlPlugin
  32. {
  33. public:
  34. explicit TYqlPlugin(TYqlPluginOptions& options)
  35. : TDynamicYqlPlugin(options.YqlPluginSharedLibrary)
  36. {
  37. std::vector<TBridgeYqlPluginOptions::TBridgeCluster> bridgeClusters;
  38. for (const auto& [cluster, proxy]: options.Clusters) {
  39. bridgeClusters.push_back({
  40. .Cluster = cluster.data(),
  41. .Proxy = proxy.data(),
  42. });
  43. }
  44. auto operationAttributesString = options.OperationAttributes ? options.OperationAttributes.ToString() : "{}";
  45. const char* defaultCluster = options.DefaultCluster
  46. ? options.DefaultCluster->data()
  47. : nullptr;
  48. TBridgeYqlPluginOptions bridgeOptions {
  49. .MRJobBinary = options.MRJobBinary.data(),
  50. .UdfDirectory = options.UdfDirectory.data(),
  51. .ClusterCount = static_cast<int>(bridgeClusters.size()),
  52. .Clusters = bridgeClusters.data(),
  53. .DefaultCluster = defaultCluster,
  54. .OperationAttributes = operationAttributesString.data(),
  55. .OperationAttributesLength = static_cast<int>(operationAttributesString.size()),
  56. .YTTokenPath = options.YTTokenPath.data(),
  57. .LogBackend = &options.LogBackend,
  58. };
  59. BridgePlugin_ = BridgeCreateYqlPlugin(&bridgeOptions);
  60. }
  61. TQueryResult Run(TString impersonationUser, TString queryText, NYson::TYsonString settings) noexcept override
  62. {
  63. auto settingsString = settings ? settings.ToString() : "{}";
  64. auto* bridgeQueryResult = BridgeRun(BridgePlugin_, impersonationUser.data(), queryText.data(), settingsString.data());
  65. auto toString = [] (const char* str, size_t strLength) -> std::optional<TString> {
  66. if (!str) {
  67. return std::nullopt;
  68. }
  69. return TString(str, strLength);
  70. };
  71. TQueryResult queryResult = {
  72. .YsonResult = toString(bridgeQueryResult->YsonResult, bridgeQueryResult->YsonResultLength),
  73. .Plan = toString(bridgeQueryResult->Plan, bridgeQueryResult->PlanLength),
  74. .Statistics = toString(bridgeQueryResult->Statistics, bridgeQueryResult->StatisticsLength),
  75. .TaskInfo = toString(bridgeQueryResult->TaskInfo, bridgeQueryResult->TaskInfoLength),
  76. .YsonError = toString(bridgeQueryResult->YsonError, bridgeQueryResult->YsonErrorLength),
  77. };
  78. BridgeFreeQueryResult(bridgeQueryResult);
  79. return queryResult;
  80. }
  81. ~TYqlPlugin() override
  82. {
  83. BridgeFreeYqlPlugin(BridgePlugin_);
  84. }
  85. private:
  86. TBridgeYqlPlugin* BridgePlugin_;
  87. };
  88. ////////////////////////////////////////////////////////////////////////////////
  89. } // namespace NBridge
  90. ////////////////////////////////////////////////////////////////////////////////
  91. std::unique_ptr<IYqlPlugin> CreateYqlPlugin(TYqlPluginOptions& options) noexcept
  92. {
  93. return std::make_unique<NBridge::TYqlPlugin>(options);
  94. }
  95. ////////////////////////////////////////////////////////////////////////////////
  96. } // namespace NYT::NYqlPlugin::NBridge