@@ -50,11 +50,18 @@ use crate::{
50
50
51
51
use self :: routines:: Routine ;
52
52
53
+ use regex:: bytes:: Regex ;
54
+
53
55
pub mod binlog_stream;
54
56
pub mod pool;
55
57
pub mod routines;
56
58
pub mod stmt_cache;
57
59
60
+ lazy_static:: lazy_static! {
61
+ static ref FIXED_MARIADB_VERSION_RE : Regex =
62
+ Regex :: new( r"^(?:5.5.5-)?(\d{1,2})\.(\d{1,2})\.(\d{1,3})-MariaDB" ) . unwrap( ) ;
63
+ }
64
+
58
65
/// Helper that asynchronously disconnects the givent connection on the default tokio executor.
59
66
fn disconnect ( mut conn : Conn ) {
60
67
let disconnected = conn. inner . disconnected ;
@@ -469,14 +476,14 @@ impl Conn {
469
476
} ;
470
477
471
478
self . inner . capabilities = handshake. capabilities ( ) & self . inner . opts . get_capabilities ( ) ;
472
- self . inner . version = handshake
473
- . maria_db_server_version_parsed ( )
474
- . map ( |version| {
475
- self . inner . is_mariadb = true ;
476
- version
477
- } )
478
- . or_else ( || handshake. server_version_parsed ( ) )
479
- . unwrap_or ( ( 0 , 0 , 0 ) ) ;
479
+ self . inner . version =
480
+ Self :: fixed_maria_db_server_version_parsed ( handshake . server_version_ref ( ) )
481
+ . map ( |version| {
482
+ self . inner . is_mariadb = true ;
483
+ version
484
+ } )
485
+ . or_else ( || handshake. server_version_parsed ( ) )
486
+ . unwrap_or ( ( 0 , 0 , 0 ) ) ;
480
487
self . inner . id = handshake. connection_id ( ) ;
481
488
self . inner . status = handshake. status_flags ( ) ;
482
489
self . inner . auth_plugin = match handshake. auth_plugin ( ) {
@@ -493,6 +500,20 @@ impl Conn {
493
500
Ok ( ( ) )
494
501
}
495
502
503
+ /// Parsed mariadb server version.
504
+ /// Fixed version of `Handshake::maria_db_server_version_parsed` (only present on Prisma's fork).
505
+ /// See https://github.com/blackbeam/rust_mysql_common/issues/124 for more info.
506
+ pub fn fixed_maria_db_server_version_parsed ( version : & [ u8 ] ) -> Option < ( u16 , u16 , u16 ) > {
507
+ FIXED_MARIADB_VERSION_RE . captures ( version) . map ( |captures| {
508
+ // Should not panic because validated with regex
509
+ (
510
+ lexical:: parse :: < u16 , _ > ( captures. get ( 1 ) . unwrap ( ) . as_bytes ( ) ) . unwrap ( ) ,
511
+ lexical:: parse :: < u16 , _ > ( captures. get ( 2 ) . unwrap ( ) . as_bytes ( ) ) . unwrap ( ) ,
512
+ lexical:: parse :: < u16 , _ > ( captures. get ( 3 ) . unwrap ( ) . as_bytes ( ) ) . unwrap ( ) ,
513
+ )
514
+ } )
515
+ }
516
+
496
517
async fn switch_to_ssl_if_needed ( & mut self ) -> Result < ( ) > {
497
518
if self
498
519
. inner
0 commit comments