emqx_bridge_sqlserver.erl 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. %%--------------------------------------------------------------------
  2. %% Copyright (c) 2022-2023 EMQ Technologies Co., Ltd. All Rights Reserved.
  3. %%--------------------------------------------------------------------
  4. -module(emqx_bridge_sqlserver).
  5. -include_lib("typerefl/include/types.hrl").
  6. -include_lib("hocon/include/hoconsc.hrl").
  7. -include_lib("emqx_bridge/include/emqx_bridge.hrl").
  8. -include_lib("emqx_resource/include/emqx_resource.hrl").
  9. -import(hoconsc, [mk/2, enum/1, ref/2]).
  10. -export([
  11. conn_bridge_examples/1
  12. ]).
  13. -export([
  14. namespace/0,
  15. roots/0,
  16. fields/1,
  17. desc/1
  18. ]).
  19. -define(DEFAULT_SQL, <<
  20. "insert into t_mqtt_msg(msgid, topic, qos, payload) "
  21. "values ( ${id}, ${topic}, ${qos}, ${payload} )"
  22. >>).
  23. -define(DEFAULT_DRIVER, <<"ms-sql">>).
  24. conn_bridge_examples(Method) ->
  25. [
  26. #{
  27. <<"sqlserver">> => #{
  28. summary => <<"Microsoft SQL Server Bridge">>,
  29. value => values(Method)
  30. }
  31. }
  32. ].
  33. values(get) ->
  34. values(post);
  35. values(post) ->
  36. #{
  37. enable => true,
  38. type => sqlserver,
  39. name => <<"bar">>,
  40. server => <<"127.0.0.1:1433">>,
  41. database => <<"test">>,
  42. pool_size => 8,
  43. username => <<"sa">>,
  44. password => <<"******">>,
  45. sql => ?DEFAULT_SQL,
  46. driver => ?DEFAULT_DRIVER,
  47. local_topic => <<"local/topic/#">>,
  48. resource_opts => #{
  49. worker_pool_size => 1,
  50. health_check_interval => ?HEALTHCHECK_INTERVAL_RAW,
  51. batch_size => ?DEFAULT_BATCH_SIZE,
  52. batch_time => ?DEFAULT_BATCH_TIME,
  53. query_mode => async,
  54. max_buffer_bytes => ?DEFAULT_BUFFER_BYTES
  55. }
  56. };
  57. values(put) ->
  58. values(post).
  59. %% -------------------------------------------------------------------------------------------------
  60. %% Hocon Schema Definitions
  61. namespace() -> "bridge_sqlserver".
  62. roots() -> [].
  63. fields("config") ->
  64. [
  65. {enable, mk(boolean(), #{desc => ?DESC("config_enable"), default => true})},
  66. {sql,
  67. mk(
  68. binary(),
  69. #{desc => ?DESC("sql_template"), default => ?DEFAULT_SQL, format => <<"sql">>}
  70. )},
  71. {driver, mk(binary(), #{desc => ?DESC("driver"), default => ?DEFAULT_DRIVER})},
  72. {local_topic,
  73. mk(
  74. binary(),
  75. #{desc => ?DESC("local_topic"), default => undefined}
  76. )},
  77. {resource_opts,
  78. mk(
  79. ref(?MODULE, "creation_opts"),
  80. #{
  81. required => false,
  82. default => #{},
  83. desc => ?DESC(emqx_resource_schema, <<"resource_opts">>)
  84. }
  85. )}
  86. ] ++
  87. (emqx_bridge_sqlserver_connector:fields(config) --
  88. emqx_connector_schema_lib:prepare_statement_fields());
  89. fields("creation_opts") ->
  90. emqx_resource_schema:fields("creation_opts");
  91. fields("post") ->
  92. fields("post", sqlserver);
  93. fields("put") ->
  94. fields("config");
  95. fields("get") ->
  96. emqx_bridge_schema:status_fields() ++ fields("post").
  97. fields("post", Type) ->
  98. [type_field(Type), name_field() | fields("config")].
  99. desc("config") ->
  100. ?DESC("desc_config");
  101. desc(Method) when Method =:= "get"; Method =:= "put"; Method =:= "post" ->
  102. ["Configuration for Microsoft SQL Server using `", string:to_upper(Method), "` method."];
  103. desc("creation_opts" = Name) ->
  104. emqx_resource_schema:desc(Name);
  105. desc(_) ->
  106. undefined.
  107. %% -------------------------------------------------------------------------------------------------
  108. type_field(Type) ->
  109. {type, mk(enum([Type]), #{required => true, desc => ?DESC("desc_type")})}.
  110. name_field() ->
  111. {name, mk(binary(), #{required => true, desc => ?DESC("desc_name")})}.