348
315
DBUG_VOID_RETURN;
354
Create a named pipe connection
359
HANDLE create_named_pipe(MYSQL *mysql, uint connect_timeout, char **arg_host,
360
char **arg_unix_socket)
362
HANDLE hPipe=INVALID_HANDLE_VALUE;
363
char pipe_name[1024];
366
my_bool testing_named_pipes=0;
367
char *host= *arg_host, *unix_socket= *arg_unix_socket;
369
if ( ! unix_socket || (unix_socket)[0] == 0x00)
370
unix_socket = mysql_unix_port;
371
if (!host || !strcmp(host,LOCAL_HOST))
372
host=LOCAL_HOST_NAMEDPIPE;
375
pipe_name[sizeof(pipe_name)-1]= 0; /* Safety if too long string */
376
strxnmov(pipe_name, sizeof(pipe_name)-1, "\\\\", host, "\\pipe\\",
378
DBUG_PRINT("info",("Server name: '%s'. Named Pipe: %s", host, unix_socket));
380
for (i=0 ; i < 100 ; i++) /* Don't retry forever */
382
if ((hPipe = CreateFile(pipe_name,
383
GENERIC_READ | GENERIC_WRITE,
388
NULL )) != INVALID_HANDLE_VALUE)
390
if (GetLastError() != ERROR_PIPE_BUSY)
392
set_mysql_extended_error(mysql, CR_NAMEDPIPEOPEN_ERROR,
393
unknown_sqlstate, ER(CR_NAMEDPIPEOPEN_ERROR),
394
host, unix_socket, (ulong) GetLastError());
395
return INVALID_HANDLE_VALUE;
397
/* wait for for an other instance */
398
if (! WaitNamedPipe(pipe_name, connect_timeout*1000) )
400
set_mysql_extended_error(mysql, CR_NAMEDPIPEWAIT_ERROR, unknown_sqlstate,
401
ER(CR_NAMEDPIPEWAIT_ERROR),
402
host, unix_socket, (ulong) GetLastError());
403
return INVALID_HANDLE_VALUE;
406
if (hPipe == INVALID_HANDLE_VALUE)
408
set_mysql_extended_error(mysql, CR_NAMEDPIPEOPEN_ERROR, unknown_sqlstate,
409
ER(CR_NAMEDPIPEOPEN_ERROR), host, unix_socket,
410
(ulong) GetLastError());
411
return INVALID_HANDLE_VALUE;
413
dwMode = PIPE_READMODE_BYTE | PIPE_WAIT;
414
if ( !SetNamedPipeHandleState(hPipe, &dwMode, NULL, NULL) )
416
CloseHandle( hPipe );
417
set_mysql_extended_error(mysql, CR_NAMEDPIPESETSTATE_ERROR,
418
unknown_sqlstate, ER(CR_NAMEDPIPESETSTATE_ERROR),
419
host, unix_socket, (ulong) GetLastError());
420
return INVALID_HANDLE_VALUE;
422
*arg_host=host ; *arg_unix_socket=unix_socket; /* connect arg */
429
Create new shared memory connection, return handler of connection
432
create_shared_memory()
433
mysql Pointer of mysql structure
434
net Pointer of net structure
435
connect_timeout Timeout of connection
439
HANDLE create_shared_memory(MYSQL *mysql,NET *net, uint connect_timeout)
441
ulong smem_buffer_length = shared_memory_buffer_length + 4;
443
event_connect_request is event object for start connection actions
444
event_connect_answer is event object for confirm, that server put data
445
handle_connect_file_map is file-mapping object, use for create shared
447
handle_connect_map is pointer on shared memory
448
handle_map is pointer on shared memory for client
452
event_client_read are events for transfer data between server and client
453
handle_file_map is file-mapping object, use for create shared memory
455
HANDLE event_connect_request = NULL;
456
HANDLE event_connect_answer = NULL;
457
HANDLE handle_connect_file_map = NULL;
458
char *handle_connect_map = NULL;
460
char *handle_map = NULL;
461
HANDLE event_server_wrote = NULL;
462
HANDLE event_server_read = NULL;
463
HANDLE event_client_wrote = NULL;
464
HANDLE event_client_read = NULL;
465
HANDLE event_conn_closed = NULL;
466
HANDLE handle_file_map = NULL;
467
ulong connect_number;
468
char connect_number_char[22], *p;
471
DWORD error_allow = 0;
472
DWORD error_code = 0;
473
DWORD event_access_rights= SYNCHRONIZE | EVENT_MODIFY_STATE;
474
char *shared_memory_base_name = mysql->options.shared_memory_base_name;
477
get enough space base-name + '_' + longest suffix we might ever send
479
if (!(tmp= (char *)my_malloc(strlen(shared_memory_base_name) + 32L, MYF(MY_FAE))))
483
The name of event and file-mapping events create agree next rule:
484
shared_memory_base_name+unique_part
486
shared_memory_base_name is unique value for each server
487
unique_part is uniquel value for each object (events and file-mapping)
489
suffix_pos = strxmov(tmp, "Global\\", shared_memory_base_name, "_", NullS);
490
strmov(suffix_pos, "CONNECT_REQUEST");
491
if (!(event_connect_request= OpenEvent(event_access_rights, FALSE, tmp)))
493
error_allow = CR_SHARED_MEMORY_CONNECT_REQUEST_ERROR;
496
strmov(suffix_pos, "CONNECT_ANSWER");
497
if (!(event_connect_answer= OpenEvent(event_access_rights,FALSE,tmp)))
499
error_allow = CR_SHARED_MEMORY_CONNECT_ANSWER_ERROR;
502
strmov(suffix_pos, "CONNECT_DATA");
503
if (!(handle_connect_file_map= OpenFileMapping(FILE_MAP_WRITE,FALSE,tmp)))
505
error_allow = CR_SHARED_MEMORY_CONNECT_FILE_MAP_ERROR;
508
if (!(handle_connect_map= MapViewOfFile(handle_connect_file_map,
509
FILE_MAP_WRITE,0,0,sizeof(DWORD))))
511
error_allow = CR_SHARED_MEMORY_CONNECT_MAP_ERROR;
515
/* Send to server request of connection */
516
if (!SetEvent(event_connect_request))
518
error_allow = CR_SHARED_MEMORY_CONNECT_SET_ERROR;
522
/* Wait of answer from server */
523
if (WaitForSingleObject(event_connect_answer,connect_timeout*1000) !=
526
error_allow = CR_SHARED_MEMORY_CONNECT_ABANDONED_ERROR;
530
/* Get number of connection */
531
connect_number = uint4korr(handle_connect_map);/*WAX2*/
532
p= int10_to_str(connect_number, connect_number_char, 10);
535
The name of event and file-mapping events create agree next rule:
536
shared_memory_base_name+unique_part+number_of_connection
539
shared_memory_base_name is uniquel value for each server
540
unique_part is uniquel value for each object (events and file-mapping)
541
number_of_connection is number of connection between server and client
543
suffix_pos = strxmov(tmp, "Global\\", shared_memory_base_name, "_", connect_number_char,
545
strmov(suffix_pos, "DATA");
546
if ((handle_file_map = OpenFileMapping(FILE_MAP_WRITE,FALSE,tmp)) == NULL)
548
error_allow = CR_SHARED_MEMORY_FILE_MAP_ERROR;
551
if ((handle_map = MapViewOfFile(handle_file_map,FILE_MAP_WRITE,0,0,
552
smem_buffer_length)) == NULL)
554
error_allow = CR_SHARED_MEMORY_MAP_ERROR;
558
strmov(suffix_pos, "SERVER_WROTE");
559
if ((event_server_wrote = OpenEvent(event_access_rights,FALSE,tmp)) == NULL)
561
error_allow = CR_SHARED_MEMORY_EVENT_ERROR;
565
strmov(suffix_pos, "SERVER_READ");
566
if ((event_server_read = OpenEvent(event_access_rights,FALSE,tmp)) == NULL)
568
error_allow = CR_SHARED_MEMORY_EVENT_ERROR;
572
strmov(suffix_pos, "CLIENT_WROTE");
573
if ((event_client_wrote = OpenEvent(event_access_rights,FALSE,tmp)) == NULL)
575
error_allow = CR_SHARED_MEMORY_EVENT_ERROR;
579
strmov(suffix_pos, "CLIENT_READ");
580
if ((event_client_read = OpenEvent(event_access_rights,FALSE,tmp)) == NULL)
582
error_allow = CR_SHARED_MEMORY_EVENT_ERROR;
586
strmov(suffix_pos, "CONNECTION_CLOSED");
587
if ((event_conn_closed = OpenEvent(event_access_rights,FALSE,tmp)) == NULL)
589
error_allow = CR_SHARED_MEMORY_EVENT_ERROR;
593
Set event that server should send data
595
SetEvent(event_server_read);
598
if (error_allow == 0)
600
net->vio= vio_new_win32shared_memory(net,handle_file_map,handle_map,
602
event_server_read,event_client_wrote,
603
event_client_read,event_conn_closed);
607
error_code = GetLastError();
608
if (event_server_read)
609
CloseHandle(event_server_read);
610
if (event_server_wrote)
611
CloseHandle(event_server_wrote);
612
if (event_client_read)
613
CloseHandle(event_client_read);
614
if (event_client_wrote)
615
CloseHandle(event_client_wrote);
616
if (event_conn_closed)
617
CloseHandle(event_conn_closed);
619
UnmapViewOfFile(handle_map);
621
CloseHandle(handle_file_map);
625
my_free(tmp, MYF(0));
627
error_code = GetLastError();
628
if (event_connect_request)
629
CloseHandle(event_connect_request);
630
if (event_connect_answer)
631
CloseHandle(event_connect_answer);
632
if (handle_connect_map)
633
UnmapViewOfFile(handle_connect_map);
634
if (handle_connect_file_map)
635
CloseHandle(handle_connect_file_map);
638
if (error_allow == CR_SHARED_MEMORY_EVENT_ERROR)
639
set_mysql_extended_error(mysql, error_allow, unknown_sqlstate,
640
ER(error_allow), suffix_pos, error_code);
642
set_mysql_extended_error(mysql, error_allow, unknown_sqlstate,
643
ER(error_allow), error_code);
644
return(INVALID_HANDLE_VALUE);
650
318
/*****************************************************************************
651
319
Read a packet from server. Give error message if socket was down
652
320
or packet is an error message