slidge-whatsapp 0.2.5__cp312-cp312-manylinux_2_36_aarch64.whl → 0.2.6__cp312-cp312-manylinux_2_36_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of slidge-whatsapp might be problematic. Click here for more details.

Files changed (320) hide show
  1. slidge_whatsapp/config.py +3 -0
  2. slidge_whatsapp/event.go +23 -24
  3. slidge_whatsapp/gateway.go +13 -9
  4. slidge_whatsapp/gateway.py +2 -2
  5. slidge_whatsapp/generated/_whatsapp.cpython-312-aarch64-linux-gnu.h +169 -169
  6. slidge_whatsapp/generated/_whatsapp.cpython-312-aarch64-linux-gnu.so +0 -0
  7. slidge_whatsapp/generated/build.py +135 -135
  8. slidge_whatsapp/generated/whatsapp.c +1455 -1455
  9. slidge_whatsapp/generated/whatsapp.go +737 -737
  10. slidge_whatsapp/generated/whatsapp.py +1038 -1038
  11. slidge_whatsapp/generated/whatsapp_go.h +169 -169
  12. slidge_whatsapp/go.mod +15 -12
  13. slidge_whatsapp/go.sum +41 -29
  14. slidge_whatsapp/media/media.go +16 -10
  15. slidge_whatsapp/session.go +73 -66
  16. slidge_whatsapp/vendor/github.com/ebitengine/purego/dlfcn.go +4 -4
  17. slidge_whatsapp/vendor/github.com/ebitengine/purego/dlfcn_darwin.go +0 -5
  18. slidge_whatsapp/vendor/github.com/ebitengine/purego/internal/fakecgo/go_libinit.go +3 -0
  19. slidge_whatsapp/vendor/github.com/ebitengine/purego/internal/fakecgo/symbols.go +40 -20
  20. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/CHANGELOG.md +14 -1
  21. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/ffi.go +2 -2
  22. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/fun.go +10 -2
  23. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/lib.go +1 -1
  24. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/lib_unix.go +1 -1
  25. slidge_whatsapp/vendor/github.com/jupiterrider/ffi/lib_windows.go +1 -1
  26. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/README.md +2 -7
  27. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/callback.go +2 -1
  28. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.c +8510 -5090
  29. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3-binding.h +344 -150
  30. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3.go +57 -23
  31. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_unlock_notify.c +4 -0
  32. slidge_whatsapp/vendor/github.com/mattn/go-sqlite3/sqlite3_opt_unlock_notify.go +4 -0
  33. slidge_whatsapp/vendor/github.com/petermattis/goid/.gitignore +4 -0
  34. slidge_whatsapp/vendor/github.com/petermattis/goid/LICENSE +202 -0
  35. slidge_whatsapp/vendor/github.com/petermattis/goid/README.md +4 -0
  36. slidge_whatsapp/vendor/github.com/petermattis/goid/goid.go +35 -0
  37. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_gccgo.go +26 -0
  38. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.3.c +23 -0
  39. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.3.go +22 -0
  40. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.4.go +35 -0
  41. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.4.s +18 -0
  42. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.5.go +28 -0
  43. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_go1.5.s +44 -0
  44. slidge_whatsapp/vendor/github.com/petermattis/goid/goid_slow.go +24 -0
  45. slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_gccgo_go1.8.go +17 -0
  46. slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.23.go +38 -0
  47. slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.5.go +57 -0
  48. slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.6.go +43 -0
  49. slidge_whatsapp/vendor/github.com/petermattis/goid/runtime_go1.9.go +37 -0
  50. slidge_whatsapp/vendor/github.com/rs/zerolog/CONTRIBUTING.md +43 -0
  51. slidge_whatsapp/vendor/github.com/rs/zerolog/README.md +31 -0
  52. slidge_whatsapp/vendor/github.com/rs/zerolog/console.go +20 -5
  53. slidge_whatsapp/vendor/github.com/rs/zerolog/log/log.go +131 -0
  54. slidge_whatsapp/vendor/github.com/rs/zerolog/log.go +1 -1
  55. slidge_whatsapp/vendor/github.com/rs/zerolog/sampler.go +4 -1
  56. slidge_whatsapp/vendor/github.com/rs/zerolog/writer.go +9 -0
  57. slidge_whatsapp/vendor/go.mau.fi/libsignal/groups/GroupCipher.go +17 -6
  58. slidge_whatsapp/vendor/go.mau.fi/libsignal/groups/GroupSessionBuilder.go +17 -7
  59. slidge_whatsapp/vendor/go.mau.fi/libsignal/groups/state/store/SenderKeyStore.go +4 -2
  60. slidge_whatsapp/vendor/go.mau.fi/libsignal/keys/chain/ChainKey.go +1 -0
  61. slidge_whatsapp/vendor/go.mau.fi/libsignal/keys/identity/IdentityKey.go +1 -0
  62. slidge_whatsapp/vendor/go.mau.fi/libsignal/logger/DefaultLogger.go +2 -2
  63. slidge_whatsapp/vendor/go.mau.fi/libsignal/serialize/FingerprintProtocol.pb.go +3 -2
  64. slidge_whatsapp/vendor/go.mau.fi/libsignal/serialize/LocalStorageProtocol.pb.go +3 -2
  65. slidge_whatsapp/vendor/go.mau.fi/libsignal/serialize/WhisperTextProtocol.pb.go +3 -2
  66. slidge_whatsapp/vendor/go.mau.fi/libsignal/session/Session.go +41 -17
  67. slidge_whatsapp/vendor/go.mau.fi/libsignal/session/SessionCipher.go +64 -30
  68. slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/IdentityKeyStore.go +5 -3
  69. slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/MessageKeyStore.go +6 -4
  70. slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/PreKeyStore.go +6 -4
  71. slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/SessionStore.go +8 -6
  72. slidge_whatsapp/vendor/go.mau.fi/libsignal/state/store/SignedPreKeyStore.go +7 -5
  73. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/connlog.go +257 -0
  74. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/database.go +309 -0
  75. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/iter.go +233 -0
  76. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/json.go +47 -0
  77. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/log.go +129 -0
  78. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/massinsert.go +164 -0
  79. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/queryhelper.go +137 -0
  80. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/reflectscan.go +30 -0
  81. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/transaction.go +180 -0
  82. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/upgrades.go +250 -0
  83. slidge_whatsapp/vendor/go.mau.fi/util/dbutil/upgradetable.go +331 -0
  84. slidge_whatsapp/vendor/go.mau.fi/util/exerrors/dualerror.go +33 -0
  85. slidge_whatsapp/vendor/go.mau.fi/util/exerrors/must.go +23 -0
  86. slidge_whatsapp/vendor/go.mau.fi/util/exhttp/cors.go +32 -0
  87. slidge_whatsapp/vendor/go.mau.fi/util/exhttp/handleerrors.go +64 -0
  88. slidge_whatsapp/vendor/go.mau.fi/util/exhttp/json.go +41 -0
  89. slidge_whatsapp/vendor/go.mau.fi/util/exhttp/middleware.go +30 -0
  90. slidge_whatsapp/vendor/go.mau.fi/util/exhttp/networkerror.go +37 -0
  91. slidge_whatsapp/vendor/go.mau.fi/util/exsync/event.go +88 -0
  92. slidge_whatsapp/vendor/go.mau.fi/util/exsync/returnonce.go +25 -0
  93. slidge_whatsapp/vendor/go.mau.fi/util/exsync/ringbuffer.go +139 -0
  94. slidge_whatsapp/vendor/go.mau.fi/util/exsync/syncmap.go +94 -0
  95. slidge_whatsapp/vendor/go.mau.fi/util/exsync/syncset.go +136 -0
  96. slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/callermarshal.go +28 -0
  97. slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/defaults.go +32 -0
  98. slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/generics.go +45 -0
  99. slidge_whatsapp/vendor/go.mau.fi/util/exzerolog/writer.go +81 -0
  100. slidge_whatsapp/vendor/go.mau.fi/util/ptr/ptr.go +43 -0
  101. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/decode.go +27 -26
  102. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/encode.go +4 -3
  103. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate/keys.go +5 -4
  104. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/appstate.go +27 -25
  105. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/armadillomessage.go +3 -2
  106. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/broadcast.go +5 -4
  107. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/client.go +60 -15
  108. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/connectionevents.go +25 -9
  109. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/download-to-file.go +45 -19
  110. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/download.go +52 -28
  111. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/errors.go +1 -0
  112. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/group.go +59 -29
  113. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/internals.go +166 -146
  114. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/keepalive.go +2 -2
  115. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/mediaconn.go +5 -3
  116. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/mediaretry.go +2 -1
  117. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/message.go +270 -111
  118. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/msgsecret.go +118 -31
  119. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/notification.go +67 -36
  120. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/pair-code.go +7 -4
  121. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/pair.go +42 -18
  122. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/prekeys.go +9 -5
  123. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/presence.go +2 -1
  124. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/privacysettings.go +10 -11
  125. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waAdv/WAAdv.pb.go +39 -9
  126. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloApplication/WAArmadilloApplication.pb.go +354 -175
  127. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloApplication/WAArmadilloApplication.proto +5 -5
  128. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloXMA/WAArmadilloXMA.pb.go +158 -15
  129. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloXMA/WAArmadilloXMA.proto +1 -0
  130. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCert/WACert.pb.go +29 -9
  131. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waChatLockSettings/WAProtobufsChatLockSettings.pb.go +13 -9
  132. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCommon/WACommon.pb.go +344 -31
  133. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCommon/WACommon.proto +26 -0
  134. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/{WAWebProtobufsCompanionReg.pb.go → WACompanionReg.pb.go} +170 -84
  135. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/{WAWebProtobufsCompanionReg.proto → WACompanionReg.proto} +1 -1
  136. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waConsumerApplication/WAConsumerApplication.pb.go +173 -9
  137. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waDeviceCapabilities/WAProtobufsDeviceCapabilities.pb.go +78 -16
  138. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waDeviceCapabilities/WAProtobufsDeviceCapabilities.proto +5 -0
  139. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.pb.go +6747 -2230
  140. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.proto +294 -43
  141. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.pb.go +456 -135
  142. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.proto +14 -0
  143. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMediaTransport/WAMediaTransport.pb.go +162 -9
  144. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMediaTransport/WAMediaTransport.proto +1 -0
  145. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMmsRetry/WAMmsRetry.pb.go +32 -9
  146. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMmsRetry/WAMmsRetry.proto +1 -0
  147. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgApplication/WAMsgApplication.pb.go +192 -52
  148. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgApplication/WAMsgApplication.proto +8 -0
  149. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgTransport/WAMsgTransport.pb.go +60 -9
  150. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMultiDevice/WAMultiDevice.pb.go +39 -9
  151. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waServerSync/WAServerSync.pb.go +61 -9
  152. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.pb.go +1051 -382
  153. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.proto +32 -0
  154. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waUserPassword/WAProtobufsUserPassword.pb.go +27 -9
  155. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waVnameCert/WAWebProtobufsVnameCert.pb.go +59 -9
  156. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.pb.go +382 -78
  157. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.proto +8 -0
  158. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.pb.go +555 -9
  159. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.proto +2 -0
  160. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/receipt.go +13 -3
  161. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/retry.go +29 -19
  162. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/send.go +244 -73
  163. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/sendfb.go +27 -16
  164. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/clientpayload.go +3 -1
  165. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/noop.go +85 -43
  166. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/signal.go +75 -88
  167. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/container.go +79 -61
  168. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/lidmap.go +186 -0
  169. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/store.go +291 -167
  170. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/00-latest-schema.sql +153 -0
  171. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/03-message-secrets.sql +11 -0
  172. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/04-privacy-tokens.sql +8 -0
  173. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/05-account-jid-format.sql +2 -0
  174. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/06-facebook-uuid.sql +2 -0
  175. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/07-account-lid.sql +2 -0
  176. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/08-lid-mapping.sql +5 -0
  177. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/09-decryption-buffer.sql +10 -0
  178. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrades/upgrades.go +22 -0
  179. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/store.go +105 -56
  180. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/botmap.go +210 -0
  181. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/events/events.go +8 -0
  182. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/group.go +15 -6
  183. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/jid.go +7 -8
  184. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/types/message.go +17 -0
  185. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/update.go +3 -2
  186. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/upload.go +1 -1
  187. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/user.go +45 -29
  188. slidge_whatsapp/vendor/golang.org/x/exp/LICENSE +27 -0
  189. slidge_whatsapp/vendor/golang.org/x/exp/PATENTS +22 -0
  190. slidge_whatsapp/vendor/golang.org/x/exp/constraints/constraints.go +54 -0
  191. slidge_whatsapp/vendor/golang.org/x/net/http/httpguts/guts.go +50 -0
  192. slidge_whatsapp/vendor/golang.org/x/net/http/httpguts/httplex.go +347 -0
  193. slidge_whatsapp/vendor/golang.org/x/net/http2/.gitignore +2 -0
  194. slidge_whatsapp/vendor/golang.org/x/net/http2/ascii.go +53 -0
  195. slidge_whatsapp/vendor/golang.org/x/net/http2/ciphers.go +641 -0
  196. slidge_whatsapp/vendor/golang.org/x/net/http2/client_conn_pool.go +311 -0
  197. slidge_whatsapp/vendor/golang.org/x/net/http2/config.go +122 -0
  198. slidge_whatsapp/vendor/golang.org/x/net/http2/config_go124.go +61 -0
  199. slidge_whatsapp/vendor/golang.org/x/net/http2/config_pre_go124.go +16 -0
  200. slidge_whatsapp/vendor/golang.org/x/net/http2/databuffer.go +149 -0
  201. slidge_whatsapp/vendor/golang.org/x/net/http2/errors.go +145 -0
  202. slidge_whatsapp/vendor/golang.org/x/net/http2/flow.go +120 -0
  203. slidge_whatsapp/vendor/golang.org/x/net/http2/frame.go +1702 -0
  204. slidge_whatsapp/vendor/golang.org/x/net/http2/gotrack.go +170 -0
  205. slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/encode.go +245 -0
  206. slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/hpack.go +523 -0
  207. slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/huffman.go +226 -0
  208. slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/static_table.go +188 -0
  209. slidge_whatsapp/vendor/golang.org/x/net/http2/hpack/tables.go +403 -0
  210. slidge_whatsapp/vendor/golang.org/x/net/http2/http2.go +432 -0
  211. slidge_whatsapp/vendor/golang.org/x/net/http2/pipe.go +184 -0
  212. slidge_whatsapp/vendor/golang.org/x/net/http2/server.go +3350 -0
  213. slidge_whatsapp/vendor/golang.org/x/net/http2/timer.go +20 -0
  214. slidge_whatsapp/vendor/golang.org/x/net/http2/transport.go +3287 -0
  215. slidge_whatsapp/vendor/golang.org/x/net/http2/unencrypted.go +32 -0
  216. slidge_whatsapp/vendor/golang.org/x/net/http2/write.go +381 -0
  217. slidge_whatsapp/vendor/golang.org/x/net/http2/writesched.go +251 -0
  218. slidge_whatsapp/vendor/golang.org/x/net/http2/writesched_priority.go +451 -0
  219. slidge_whatsapp/vendor/golang.org/x/net/http2/writesched_random.go +77 -0
  220. slidge_whatsapp/vendor/golang.org/x/net/http2/writesched_roundrobin.go +119 -0
  221. slidge_whatsapp/vendor/golang.org/x/net/idna/go118.go +13 -0
  222. slidge_whatsapp/vendor/golang.org/x/net/idna/idna10.0.0.go +769 -0
  223. slidge_whatsapp/vendor/golang.org/x/net/idna/idna9.0.0.go +717 -0
  224. slidge_whatsapp/vendor/golang.org/x/net/idna/pre_go118.go +11 -0
  225. slidge_whatsapp/vendor/golang.org/x/net/idna/punycode.go +217 -0
  226. slidge_whatsapp/vendor/golang.org/x/net/idna/tables10.0.0.go +4559 -0
  227. slidge_whatsapp/vendor/golang.org/x/net/idna/tables11.0.0.go +4653 -0
  228. slidge_whatsapp/vendor/golang.org/x/net/idna/tables12.0.0.go +4733 -0
  229. slidge_whatsapp/vendor/golang.org/x/net/idna/tables13.0.0.go +4959 -0
  230. slidge_whatsapp/vendor/golang.org/x/net/idna/tables15.0.0.go +5144 -0
  231. slidge_whatsapp/vendor/golang.org/x/net/idna/tables9.0.0.go +4486 -0
  232. slidge_whatsapp/vendor/golang.org/x/net/idna/trie.go +51 -0
  233. slidge_whatsapp/vendor/golang.org/x/net/idna/trie12.0.0.go +30 -0
  234. slidge_whatsapp/vendor/golang.org/x/net/idna/trie13.0.0.go +30 -0
  235. slidge_whatsapp/vendor/golang.org/x/net/idna/trieval.go +119 -0
  236. slidge_whatsapp/vendor/golang.org/x/net/internal/httpcommon/ascii.go +53 -0
  237. slidge_whatsapp/vendor/golang.org/x/net/internal/httpcommon/headermap.go +115 -0
  238. slidge_whatsapp/vendor/golang.org/x/net/internal/httpcommon/request.go +467 -0
  239. slidge_whatsapp/vendor/golang.org/x/sys/unix/syscall_darwin.go +148 -1
  240. slidge_whatsapp/vendor/golang.org/x/sys/unix/syscall_linux.go +16 -26
  241. slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +84 -0
  242. slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s +20 -0
  243. slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +84 -0
  244. slidge_whatsapp/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s +20 -0
  245. slidge_whatsapp/vendor/golang.org/x/sys/windows/security_windows.go +44 -5
  246. slidge_whatsapp/vendor/golang.org/x/sys/windows/syscall_windows.go +4 -2
  247. slidge_whatsapp/vendor/golang.org/x/sys/windows/types_windows.go +239 -0
  248. slidge_whatsapp/vendor/golang.org/x/sys/windows/zsyscall_windows.go +9 -0
  249. slidge_whatsapp/vendor/golang.org/x/text/LICENSE +27 -0
  250. slidge_whatsapp/vendor/golang.org/x/text/PATENTS +22 -0
  251. slidge_whatsapp/vendor/golang.org/x/text/secure/bidirule/bidirule.go +336 -0
  252. slidge_whatsapp/vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go +11 -0
  253. slidge_whatsapp/vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go +14 -0
  254. slidge_whatsapp/vendor/golang.org/x/text/transform/transform.go +709 -0
  255. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/bidi.go +359 -0
  256. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/bracket.go +335 -0
  257. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/core.go +1071 -0
  258. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/prop.go +206 -0
  259. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go +1815 -0
  260. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables11.0.0.go +1887 -0
  261. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables12.0.0.go +1923 -0
  262. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go +1955 -0
  263. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go +2042 -0
  264. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go +1781 -0
  265. slidge_whatsapp/vendor/golang.org/x/text/unicode/bidi/trieval.go +48 -0
  266. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/composition.go +512 -0
  267. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/forminfo.go +279 -0
  268. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/input.go +109 -0
  269. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/iter.go +458 -0
  270. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/normalize.go +610 -0
  271. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/readwriter.go +125 -0
  272. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables10.0.0.go +7657 -0
  273. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables11.0.0.go +7693 -0
  274. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables12.0.0.go +7710 -0
  275. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go +7760 -0
  276. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go +7907 -0
  277. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/tables9.0.0.go +7637 -0
  278. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/transform.go +88 -0
  279. slidge_whatsapp/vendor/golang.org/x/text/unicode/norm/trie.go +54 -0
  280. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/editiondefaults/editions_defaults.binpb +0 -0
  281. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/filedesc/editions.go +3 -0
  282. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go +16 -0
  283. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/strs/{strings_unsafe_go121.go → strings_unsafe.go} +0 -2
  284. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/version/version.go +1 -1
  285. slidge_whatsapp/vendor/google.golang.org/protobuf/proto/merge.go +6 -0
  286. slidge_whatsapp/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go +2 -0
  287. slidge_whatsapp/vendor/google.golang.org/protobuf/reflect/protoreflect/{value_unsafe_go121.go → value_unsafe.go} +0 -2
  288. slidge_whatsapp/vendor/modules.txt +38 -13
  289. {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.6.dist-info}/METADATA +1 -1
  290. {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.6.dist-info}/RECORD +293 -180
  291. {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.6.dist-info}/WHEEL +1 -1
  292. slidge_whatsapp/vendor/github.com/rs/zerolog/CNAME +0 -1
  293. slidge_whatsapp/vendor/github.com/rs/zerolog/_config.yml +0 -1
  294. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waAdv/WAAdv.pb.raw +0 -0
  295. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloApplication/WAArmadilloApplication.pb.raw +0 -0
  296. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waArmadilloXMA/WAArmadilloXMA.pb.raw +0 -0
  297. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCert/WACert.pb.raw +0 -23
  298. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waChatLockSettings/WAProtobufsChatLockSettings.pb.raw +0 -7
  299. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCommon/WACommon.pb.raw +0 -0
  300. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waCompanionReg/WAWebProtobufsCompanionReg.pb.raw +0 -0
  301. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waConsumerApplication/WAConsumerApplication.pb.raw +0 -0
  302. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waDeviceCapabilities/WAProtobufsDeviceCapabilities.pb.raw +0 -0
  303. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waE2E/WAWebProtobufsE2E.pb.raw +0 -0
  304. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waHistorySync/WAWebProtobufsHistorySync.pb.raw +0 -0
  305. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMediaTransport/WAMediaTransport.pb.raw +0 -0
  306. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMmsRetry/WAMmsRetry.pb.raw +0 -0
  307. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgApplication/WAMsgApplication.pb.raw +0 -0
  308. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMsgTransport/WAMsgTransport.pb.raw +0 -0
  309. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waMultiDevice/WAMultiDevice.pb.raw +0 -0
  310. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waServerSync/WAServerSync.pb.raw +0 -0
  311. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waSyncAction/WASyncAction.pb.raw +0 -0
  312. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waUserPassword/WAProtobufsUserPassword.pb.raw +0 -0
  313. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waVnameCert/WAWebProtobufsVnameCert.pb.raw +0 -0
  314. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWa6/WAWebProtobufsWa6.pb.raw +0 -0
  315. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/proto/waWeb/WAWebProtobufsWeb.pb.raw +0 -0
  316. slidge_whatsapp/vendor/go.mau.fi/whatsmeow/store/sqlstore/upgrade.go +0 -296
  317. slidge_whatsapp/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe_go120.go +0 -94
  318. slidge_whatsapp/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe_go120.go +0 -98
  319. {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.6.dist-info}/LICENSE +0 -0
  320. {slidge_whatsapp-0.2.5.dist-info → slidge_whatsapp-0.2.6.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,137 @@
1
+ // Copyright (c) 2023 Tulir Asokan
2
+ //
3
+ // This Source Code Form is subject to the terms of the Mozilla Public
4
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
5
+ // file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
+
7
+ package dbutil
8
+
9
+ import (
10
+ "context"
11
+ "database/sql"
12
+ "errors"
13
+ "time"
14
+
15
+ "golang.org/x/exp/constraints"
16
+ )
17
+
18
+ // DataStruct is an interface for structs that represent a single database row.
19
+ type DataStruct[T any] interface {
20
+ Scan(row Scannable) (T, error)
21
+ }
22
+
23
+ // QueryHelper is a generic helper struct for SQL query execution boilerplate.
24
+ //
25
+ // After implementing the Scan and Init methods in a data struct, the query
26
+ // helper allows writing query functions in a single line.
27
+ type QueryHelper[T DataStruct[T]] struct {
28
+ db *Database
29
+ newFunc func(qh *QueryHelper[T]) T
30
+ }
31
+
32
+ func MakeQueryHelper[T DataStruct[T]](db *Database, new func(qh *QueryHelper[T]) T) *QueryHelper[T] {
33
+ return &QueryHelper[T]{db: db, newFunc: new}
34
+ }
35
+
36
+ // ValueOrErr is a helper function that returns the value if err is nil, or
37
+ // returns nil and the error if err is not nil. It can be used to avoid
38
+ // `if err != nil { return nil, err }` boilerplate in certain cases like
39
+ // DataStruct.Scan implementations.
40
+ func ValueOrErr[T any](val *T, err error) (*T, error) {
41
+ if err != nil {
42
+ return nil, err
43
+ }
44
+ return val, nil
45
+ }
46
+
47
+ // StrPtr returns a pointer to the given string, or nil if the string is empty.
48
+ func StrPtr[T ~string](val T) *string {
49
+ if val == "" {
50
+ return nil
51
+ }
52
+ strVal := string(val)
53
+ return &strVal
54
+ }
55
+
56
+ // NumPtr returns a pointer to the given number, or nil if the number is zero.
57
+ func NumPtr[T constraints.Integer | constraints.Float](val T) *T {
58
+ if val == 0 {
59
+ return nil
60
+ }
61
+ return &val
62
+ }
63
+
64
+ // UnixPtr returns a pointer to the given time as unix seconds, or nil if the time is zero.
65
+ func UnixPtr(val time.Time) *int64 {
66
+ return ConvertedPtr(val, time.Time.Unix)
67
+ }
68
+
69
+ // UnixMilliPtr returns a pointer to the given time as unix milliseconds, or nil if the time is zero.
70
+ func UnixMilliPtr(val time.Time) *int64 {
71
+ return ConvertedPtr(val, time.Time.UnixMilli)
72
+ }
73
+
74
+ type Zeroable interface {
75
+ IsZero() bool
76
+ }
77
+
78
+ // ConvertedPtr returns a pointer to the converted version of the given value, or nil if the input is zero.
79
+ //
80
+ // This is primarily meant for time.Time, but it can be used with any type that has implements `IsZero() bool`.
81
+ //
82
+ // yourTime := time.Now()
83
+ // unixMSPtr := dbutil.TimePtr(yourTime, time.Time.UnixMilli)
84
+ func ConvertedPtr[Input Zeroable, Output any](val Input, converter func(Input) Output) *Output {
85
+ if val.IsZero() {
86
+ return nil
87
+ }
88
+ converted := converter(val)
89
+ return &converted
90
+ }
91
+
92
+ func (qh *QueryHelper[T]) GetDB() *Database {
93
+ return qh.db
94
+ }
95
+
96
+ func (qh *QueryHelper[T]) New() T {
97
+ return qh.newFunc(qh)
98
+ }
99
+
100
+ // Exec executes a query with ExecContext and returns the error.
101
+ //
102
+ // It omits the sql.Result return value, as it is rarely used. When the result
103
+ // is wanted, use `qh.GetDB().Exec(...)` instead, which is
104
+ // otherwise equivalent.
105
+ func (qh *QueryHelper[T]) Exec(ctx context.Context, query string, args ...any) error {
106
+ _, err := qh.db.Exec(ctx, query, args...)
107
+ return err
108
+ }
109
+
110
+ func (qh *QueryHelper[T]) scanNew(row Scannable) (T, error) {
111
+ return qh.New().Scan(row)
112
+ }
113
+
114
+ // QueryOne executes a query with QueryRowContext, uses the associated DataStruct
115
+ // to scan it, and returns the value. If the query returns no rows, it returns nil
116
+ // and no error.
117
+ func (qh *QueryHelper[T]) QueryOne(ctx context.Context, query string, args ...any) (val T, err error) {
118
+ val, err = qh.scanNew(qh.db.QueryRow(ctx, query, args...))
119
+ if errors.Is(err, sql.ErrNoRows) {
120
+ return *new(T), nil
121
+ }
122
+ return val, err
123
+ }
124
+
125
+ // QueryMany executes a query with QueryContext, uses the associated DataStruct
126
+ // to scan each row, and returns the values. If the query returns no rows, it
127
+ // returns a non-nil zero-length slice and no error.
128
+ func (qh *QueryHelper[T]) QueryMany(ctx context.Context, query string, args ...any) ([]T, error) {
129
+ return qh.QueryManyIter(ctx, query, args...).AsList()
130
+ }
131
+
132
+ // QueryManyIter executes a query with QueryContext and returns a RowIter
133
+ // that will use the associated DataStruct to scan each row.
134
+ func (qh *QueryHelper[T]) QueryManyIter(ctx context.Context, query string, args ...any) RowIter[T] {
135
+ rows, err := qh.db.Query(ctx, query, args...)
136
+ return NewRowIterWithError(rows, qh.scanNew, err)
137
+ }
@@ -0,0 +1,30 @@
1
+ // Copyright (c) 2024 Tulir Asokan
2
+ //
3
+ // This Source Code Form is subject to the terms of the Mozilla Public
4
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
5
+ // file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
+
7
+ package dbutil
8
+
9
+ import (
10
+ "reflect"
11
+ )
12
+
13
+ func reflectScan[T any](row Scannable) (*T, error) {
14
+ t := new(T)
15
+ val := reflect.ValueOf(t).Elem()
16
+ fields := reflect.VisibleFields(val.Type())
17
+ scanInto := make([]any, len(fields))
18
+ for i, field := range fields {
19
+ scanInto[i] = val.FieldByIndex(field.Index).Addr().Interface()
20
+ }
21
+ err := row.Scan(scanInto...)
22
+ return t, err
23
+ }
24
+
25
+ // NewSimpleReflectRowIter creates a new RowIter that uses reflection to scan rows into the given type.
26
+ //
27
+ // This is a simplified implementation that always scans to all struct fields. It does not support any kind of struct tags.
28
+ func NewSimpleReflectRowIter[T any](rows Rows, err error) RowIter[*T] {
29
+ return ConvertRowFn[*T](reflectScan[T]).NewRowIter(rows, err)
30
+ }
@@ -0,0 +1,180 @@
1
+ // Copyright (c) 2023 Tulir Asokan
2
+ //
3
+ // This Source Code Form is subject to the terms of the Mozilla Public
4
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
5
+ // file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
+
7
+ package dbutil
8
+
9
+ import (
10
+ "context"
11
+ "database/sql"
12
+ "errors"
13
+ "fmt"
14
+ "runtime"
15
+ "sync/atomic"
16
+ "time"
17
+
18
+ "github.com/petermattis/goid"
19
+ "github.com/rs/zerolog"
20
+
21
+ "go.mau.fi/util/exerrors"
22
+ "go.mau.fi/util/random"
23
+ )
24
+
25
+ var (
26
+ ErrTxn = errors.New("transaction")
27
+ ErrTxnBegin = fmt.Errorf("%w: begin", ErrTxn)
28
+ ErrTxnCommit = fmt.Errorf("%w: commit", ErrTxn)
29
+ )
30
+
31
+ type contextKey int64
32
+
33
+ const (
34
+ ContextKeyDoTxnCallerSkip contextKey = 1
35
+ )
36
+
37
+ var nextContextKeyDatabaseTransaction atomic.Uint64
38
+
39
+ func init() {
40
+ nextContextKeyDatabaseTransaction.Store(1 << 61)
41
+ }
42
+
43
+ func (db *Database) Exec(ctx context.Context, query string, args ...any) (sql.Result, error) {
44
+ return db.Execable(ctx).ExecContext(ctx, query, args...)
45
+ }
46
+
47
+ func (db *Database) Query(ctx context.Context, query string, args ...any) (Rows, error) {
48
+ return db.Execable(ctx).QueryContext(ctx, query, args...)
49
+ }
50
+
51
+ func (db *Database) QueryRow(ctx context.Context, query string, args ...any) *sql.Row {
52
+ return db.Execable(ctx).QueryRowContext(ctx, query, args...)
53
+ }
54
+
55
+ var ErrTransactionDeadlock = errors.New("attempt to start new transaction in goroutine with transaction")
56
+ var ErrQueryDeadlock = errors.New("attempt to query without context in goroutine with transaction")
57
+ var ErrAcquireDeadlock = errors.New("attempt to acquire connection without context in goroutine with transaction")
58
+
59
+ func (db *Database) BeginTx(ctx context.Context, opts *TxnOptions) (*LoggingTxn, error) {
60
+ if ctx == nil {
61
+ panic("BeginTx() called with nil ctx")
62
+ }
63
+ return db.LoggingDB.BeginTx(ctx, opts)
64
+ }
65
+
66
+ func (db *Database) DoTxn(ctx context.Context, opts *TxnOptions, fn func(ctx context.Context) error) error {
67
+ if ctx == nil {
68
+ panic("DoTxn() called with nil ctx")
69
+ }
70
+ if ctx.Value(db.txnCtxKey) != nil {
71
+ zerolog.Ctx(ctx).Trace().Msg("Already in a transaction, not creating a new one")
72
+ return fn(ctx)
73
+ } else if db.DeadlockDetection {
74
+ goroutineID := goid.Get()
75
+ if !db.txnDeadlockMap.Add(goroutineID) {
76
+ panic(ErrTransactionDeadlock)
77
+ }
78
+ defer db.txnDeadlockMap.Remove(goroutineID)
79
+ }
80
+
81
+ log := zerolog.Ctx(ctx).With().Str("db_txn_id", random.String(12)).Logger()
82
+ slowLog := log
83
+
84
+ callerSkip := 1
85
+ if val := ctx.Value(ContextKeyDoTxnCallerSkip); val != nil {
86
+ callerSkip += val.(int)
87
+ }
88
+ if pc, file, line, ok := runtime.Caller(callerSkip); ok {
89
+ slowLog = log.With().Str(zerolog.CallerFieldName, zerolog.CallerMarshalFunc(pc, file, line)).Logger()
90
+ }
91
+
92
+ start := time.Now()
93
+ deadlockCh := make(chan struct{})
94
+ go func() {
95
+ ticker := time.NewTicker(5 * time.Second)
96
+ defer ticker.Stop()
97
+
98
+ for {
99
+ select {
100
+ case <-ticker.C:
101
+ slowLog.Warn().
102
+ Float64("duration_seconds", time.Since(start).Seconds()).
103
+ Msg("Transaction still running")
104
+ case <-deadlockCh:
105
+ return
106
+ }
107
+ }
108
+ }()
109
+ defer func() {
110
+ close(deadlockCh)
111
+ dur := time.Since(start)
112
+ if dur > time.Second {
113
+ slowLog.Warn().
114
+ Float64("duration_seconds", dur.Seconds()).
115
+ Msg("Transaction took long")
116
+ }
117
+ }()
118
+ tx, err := db.BeginTx(ctx, opts)
119
+ if err != nil {
120
+ log.Trace().Err(err).Msg("Failed to begin transaction")
121
+ return exerrors.NewDualError(ErrTxnBegin, err)
122
+ }
123
+ log.Trace().Msg("Transaction started")
124
+ tx.noTotalLog = true
125
+ ctx = log.WithContext(ctx)
126
+ ctx = context.WithValue(ctx, db.txnCtxKey, tx)
127
+ err = fn(ctx)
128
+ if err != nil {
129
+ log.Trace().Err(err).Msg("Database transaction failed, rolling back")
130
+ rollbackErr := tx.Rollback()
131
+ if rollbackErr != nil {
132
+ log.Warn().Err(rollbackErr).Msg("Rollback after transaction error failed")
133
+ } else {
134
+ log.Trace().Msg("Rollback successful")
135
+ }
136
+ return err
137
+ }
138
+ err = tx.Commit()
139
+ if err != nil {
140
+ log.Trace().Err(err).Msg("Commit failed")
141
+ return exerrors.NewDualError(ErrTxnCommit, err)
142
+ }
143
+ log.Trace().Msg("Commit successful")
144
+ return nil
145
+ }
146
+
147
+ func (db *Database) Execable(ctx context.Context) Execable {
148
+ if ctx == nil {
149
+ panic("Conn() called with nil ctx")
150
+ }
151
+ txn, ok := ctx.Value(db.txnCtxKey).(Transaction)
152
+ if ok {
153
+ return txn
154
+ }
155
+ if db.DeadlockDetection && db.txnDeadlockMap.Has(goid.Get()) {
156
+ panic(ErrQueryDeadlock)
157
+ }
158
+ return &db.LoggingDB
159
+ }
160
+
161
+ func (db *Database) AcquireConn(ctx context.Context) (Conn, error) {
162
+ if ctx == nil {
163
+ return nil, fmt.Errorf("AcquireConn() called with nil ctx")
164
+ }
165
+ _, ok := ctx.Value(db.txnCtxKey).(Transaction)
166
+ if ok {
167
+ return nil, fmt.Errorf("cannot acquire connection while in a transaction")
168
+ }
169
+ if db.DeadlockDetection && db.txnDeadlockMap.Has(goid.Get()) {
170
+ panic(ErrAcquireDeadlock)
171
+ }
172
+ conn, err := db.RawDB.Conn(ctx)
173
+ if err != nil {
174
+ return nil, err
175
+ }
176
+ return &LoggingExecable{
177
+ UnderlyingExecable: conn,
178
+ db: db,
179
+ }, nil
180
+ }
@@ -0,0 +1,250 @@
1
+ // Copyright (c) 2023 Tulir Asokan
2
+ //
3
+ // This Source Code Form is subject to the terms of the Mozilla Public
4
+ // License, v. 2.0. If a copy of the MPL was not distributed with this
5
+ // file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
+
7
+ package dbutil
8
+
9
+ import (
10
+ "context"
11
+ "database/sql"
12
+ "errors"
13
+ "fmt"
14
+ )
15
+
16
+ type upgradeFunc func(context.Context, *Database) error
17
+
18
+ type upgrade struct {
19
+ message string
20
+ fn upgradeFunc
21
+
22
+ upgradesTo int
23
+ compatVersion int
24
+ transaction TxnMode
25
+ }
26
+
27
+ func (u *upgrade) DangerouslyRun(ctx context.Context, db *Database) (upgradesTo, compat int, err error) {
28
+ return u.upgradesTo, u.compatVersion, u.fn(ctx, db)
29
+ }
30
+
31
+ var ErrUnsupportedDatabaseVersion = errors.New("unsupported database schema version")
32
+ var ErrForeignTables = errors.New("the database contains foreign tables")
33
+ var ErrNotOwned = errors.New("the database is owned by")
34
+ var ErrUnsupportedDialect = errors.New("unsupported database dialect")
35
+
36
+ func DangerousInternalUpgradeVersionTable(ctx context.Context, db *Database) error {
37
+ return db.upgradeVersionTable(ctx)
38
+ }
39
+
40
+ func (db *Database) upgradeVersionTable(ctx context.Context) error {
41
+ if compatColumnExists, err := db.ColumnExists(ctx, db.VersionTable, "compat"); err != nil {
42
+ return fmt.Errorf("failed to check if version table is up to date: %w", err)
43
+ } else if !compatColumnExists {
44
+ if tableExists, err := db.TableExists(ctx, db.VersionTable); err != nil {
45
+ return fmt.Errorf("failed to check if version table exists: %w", err)
46
+ } else if !tableExists {
47
+ _, err = db.Exec(ctx, fmt.Sprintf("CREATE TABLE %s (version INTEGER, compat INTEGER)", db.VersionTable))
48
+ if err != nil {
49
+ return fmt.Errorf("failed to create version table: %w", err)
50
+ }
51
+ } else {
52
+ _, err = db.Exec(ctx, fmt.Sprintf("ALTER TABLE %s ADD COLUMN compat INTEGER", db.VersionTable))
53
+ if err != nil {
54
+ return fmt.Errorf("failed to add compat column to version table: %w", err)
55
+ }
56
+ }
57
+ }
58
+ return nil
59
+ }
60
+
61
+ func (db *Database) getVersion(ctx context.Context) (version, compat int, err error) {
62
+ if err = db.upgradeVersionTable(ctx); err != nil {
63
+ return
64
+ }
65
+
66
+ var compatNull sql.NullInt32
67
+ err = db.QueryRow(ctx, fmt.Sprintf("SELECT version, compat FROM %s LIMIT 1", db.VersionTable)).Scan(&version, &compatNull)
68
+ if errors.Is(err, sql.ErrNoRows) {
69
+ err = nil
70
+ }
71
+ if compatNull.Valid && compatNull.Int32 != 0 {
72
+ compat = int(compatNull.Int32)
73
+ } else {
74
+ compat = version
75
+ }
76
+ return
77
+ }
78
+
79
+ const (
80
+ tableExistsPostgres = "SELECT EXISTS(SELECT 1 FROM information_schema.tables WHERE table_name=$1)"
81
+ tableExistsSQLite = "SELECT EXISTS(SELECT 1 FROM sqlite_master WHERE type='table' AND tbl_name=?1)"
82
+ )
83
+
84
+ func (db *Database) TableExists(ctx context.Context, table string) (exists bool, err error) {
85
+ switch db.Dialect {
86
+ case SQLite:
87
+ err = db.QueryRow(ctx, tableExistsSQLite, table).Scan(&exists)
88
+ case Postgres:
89
+ err = db.QueryRow(ctx, tableExistsPostgres, table).Scan(&exists)
90
+ default:
91
+ err = ErrUnsupportedDialect
92
+ }
93
+ return
94
+ }
95
+
96
+ const (
97
+ columnExistsPostgres = "SELECT EXISTS(SELECT 1 FROM information_schema.columns WHERE table_name=$1 AND column_name=$2)"
98
+ columnExistsSQLite = "SELECT EXISTS(SELECT 1 FROM pragma_table_info(?1) WHERE name=?2)"
99
+ )
100
+
101
+ func (db *Database) ColumnExists(ctx context.Context, table, column string) (exists bool, err error) {
102
+ switch db.Dialect {
103
+ case SQLite:
104
+ err = db.QueryRow(ctx, columnExistsSQLite, table, column).Scan(&exists)
105
+ case Postgres:
106
+ err = db.QueryRow(ctx, columnExistsPostgres, table, column).Scan(&exists)
107
+ default:
108
+ err = ErrUnsupportedDialect
109
+ }
110
+ return
111
+ }
112
+
113
+ const createOwnerTable = `
114
+ CREATE TABLE IF NOT EXISTS database_owner (
115
+ key INTEGER PRIMARY KEY DEFAULT 0,
116
+ owner TEXT NOT NULL
117
+ )
118
+ `
119
+
120
+ func (db *Database) checkDatabaseOwner(ctx context.Context) error {
121
+ var owner string
122
+ if !db.IgnoreForeignTables {
123
+ if exists, err := db.TableExists(ctx, "state_groups_state"); err != nil {
124
+ return fmt.Errorf("failed to check if state_groups_state exists: %w", err)
125
+ } else if exists {
126
+ return fmt.Errorf("%w (found state_groups_state, likely belonging to Synapse)", ErrForeignTables)
127
+ } else if exists, err = db.TableExists(ctx, "roomserver_rooms"); err != nil {
128
+ return fmt.Errorf("failed to check if roomserver_rooms exists: %w", err)
129
+ } else if exists {
130
+ return fmt.Errorf("%w (found roomserver_rooms, likely belonging to Dendrite)", ErrForeignTables)
131
+ }
132
+ }
133
+ if db.Owner == "" {
134
+ return nil
135
+ }
136
+ if _, err := db.Exec(ctx, createOwnerTable); err != nil {
137
+ return fmt.Errorf("failed to ensure database owner table exists: %w", err)
138
+ } else if err = db.QueryRow(ctx, "SELECT owner FROM database_owner WHERE key=0").Scan(&owner); errors.Is(err, sql.ErrNoRows) {
139
+ _, err = db.Exec(ctx, "INSERT INTO database_owner (key, owner) VALUES (0, $1)", db.Owner)
140
+ if err != nil {
141
+ return fmt.Errorf("failed to insert database owner: %w", err)
142
+ }
143
+ } else if err != nil {
144
+ return fmt.Errorf("failed to check database owner: %w", err)
145
+ } else if owner != db.Owner {
146
+ return fmt.Errorf("%w %s", ErrNotOwned, owner)
147
+ }
148
+ return nil
149
+ }
150
+
151
+ func (db *Database) setVersion(ctx context.Context, version, compat int) error {
152
+ _, err := db.Exec(ctx, fmt.Sprintf("DELETE FROM %s", db.VersionTable))
153
+ if err != nil {
154
+ return err
155
+ }
156
+ _, err = db.Exec(ctx, fmt.Sprintf("INSERT INTO %s (version, compat) VALUES ($1, $2)", db.VersionTable), version, compat)
157
+ return err
158
+ }
159
+
160
+ func (db *Database) DoSQLiteTransactionWithoutForeignKeys(ctx context.Context, doUpgrade func(context.Context) error) error {
161
+ conn, err := db.AcquireConn(ctx)
162
+ if err != nil {
163
+ return fmt.Errorf("failed to acquire connection: %w", err)
164
+ }
165
+ _, err = conn.ExecContext(ctx, "PRAGMA foreign_keys=OFF")
166
+ if err != nil {
167
+ return fmt.Errorf("failed to disable foreign keys: %w", err)
168
+ }
169
+ err = db.DoTxn(ctx, &TxnOptions{Conn: conn}, func(ctx context.Context) error {
170
+ err := doUpgrade(ctx)
171
+ if err != nil {
172
+ return err
173
+ }
174
+ _, err = conn.ExecContext(ctx, "PRAGMA foreign_key_check")
175
+ if err != nil {
176
+ return fmt.Errorf("failed to check foreign keys after upgrade: %w", err)
177
+ }
178
+ return nil
179
+ })
180
+ if err != nil {
181
+ _, _ = conn.ExecContext(ctx, "PRAGMA foreign_keys=ON")
182
+ return err
183
+ }
184
+ _, err = conn.ExecContext(ctx, "PRAGMA foreign_keys=ON")
185
+ if err != nil {
186
+ return fmt.Errorf("failed to enable foreign keys: %w", err)
187
+ }
188
+ return nil
189
+ }
190
+
191
+ func (db *Database) Upgrade(ctx context.Context) error {
192
+ err := db.checkDatabaseOwner(ctx)
193
+ if err != nil {
194
+ return err
195
+ }
196
+
197
+ version, compat, err := db.getVersion(ctx)
198
+ if err != nil {
199
+ return err
200
+ }
201
+
202
+ if compat > len(db.UpgradeTable) {
203
+ if db.IgnoreUnsupportedDatabase {
204
+ db.Log.WarnUnsupportedVersion(version, compat, len(db.UpgradeTable))
205
+ return nil
206
+ }
207
+ return fmt.Errorf("%w: currently on v%d (compatible down to v%d), latest known: v%d", ErrUnsupportedDatabaseVersion, version, compat, len(db.UpgradeTable))
208
+ }
209
+
210
+ db.Log.PrepareUpgrade(version, compat, len(db.UpgradeTable))
211
+ logVersion := version
212
+ for version < len(db.UpgradeTable) {
213
+ upgradeItem := db.UpgradeTable[version]
214
+ if upgradeItem.fn == nil {
215
+ version++
216
+ continue
217
+ }
218
+ doUpgrade := func(ctx context.Context) error {
219
+ err = upgradeItem.fn(ctx, db)
220
+ if err != nil {
221
+ return fmt.Errorf("failed to run upgrade v%d->v%d: %w", version, upgradeItem.upgradesTo, err)
222
+ }
223
+ version = upgradeItem.upgradesTo
224
+ logVersion = version
225
+ err = db.setVersion(ctx, version, upgradeItem.compatVersion)
226
+ if err != nil {
227
+ return err
228
+ }
229
+ return nil
230
+ }
231
+ db.Log.DoUpgrade(logVersion, upgradeItem.upgradesTo, upgradeItem.message, upgradeItem.transaction)
232
+ switch upgradeItem.transaction {
233
+ case TxnModeOff:
234
+ err = doUpgrade(ctx)
235
+ case TxnModeOn:
236
+ err = db.DoTxn(ctx, nil, doUpgrade)
237
+ case TxnModeSQLiteForeignKeysOff:
238
+ switch db.Dialect {
239
+ case SQLite:
240
+ err = db.DoSQLiteTransactionWithoutForeignKeys(ctx, doUpgrade)
241
+ default:
242
+ err = db.DoTxn(ctx, nil, doUpgrade)
243
+ }
244
+ }
245
+ if err != nil {
246
+ return err
247
+ }
248
+ }
249
+ return nil
250
+ }