@@ -369,12 +369,10 @@ mysqlnd_stmt_prepare_read_eof(MYSQLND_STMT * s)
369
369
370
370
/* {{{ mysqlnd_stmt::prepare */
371
371
static enum_func_status
372
- MYSQLND_METHOD (mysqlnd_stmt , prepare )(MYSQLND_STMT * const s , const char * const query , const size_t query_len )
372
+ MYSQLND_METHOD (mysqlnd_stmt , prepare )(MYSQLND_STMT * s , const char * const query , const size_t query_len )
373
373
{
374
374
MYSQLND_STMT_DATA * stmt = s ? s -> data : NULL ;
375
375
MYSQLND_CONN_DATA * conn = stmt ? stmt -> conn : NULL ;
376
- MYSQLND_STMT * s_to_prepare = s ;
377
- MYSQLND_STMT_DATA * stmt_to_prepare = stmt ;
378
376
379
377
DBG_ENTER ("mysqlnd_stmt::prepare" );
380
378
if (!stmt || !conn ) {
@@ -390,25 +388,15 @@ MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * const s, const char * const
390
388
SET_EMPTY_ERROR (conn -> error_info );
391
389
392
390
if (stmt -> state > MYSQLND_STMT_INITTED ) {
393
- /* See if we have to clean the wire */
394
- if (stmt -> state == MYSQLND_STMT_WAITING_USE_OR_STORE ) {
395
- /* Do implicit use_result and then flush the result */
396
- stmt -> default_rset_handler = s -> m -> use_result ;
397
- stmt -> default_rset_handler (s );
398
- }
399
- /* No 'else' here please :) */
400
- if (stmt -> state > MYSQLND_STMT_WAITING_USE_OR_STORE && stmt -> result ) {
401
- stmt -> result -> m .skip_result (stmt -> result );
402
- }
403
391
/*
404
- Create a new test statement, which we will prepare, but if anything
405
- fails, we will scrap it.
392
+ Create a new prepared statement and destroy the previous one.
406
393
*/
407
- s_to_prepare = conn -> m -> stmt_init (conn );
408
- if (!s_to_prepare ) {
394
+ s -> m -> dtor (s , TRUE);
395
+ s = conn -> m -> stmt_init (conn );
396
+ if (!s ) {
409
397
goto fail ;
410
398
}
411
- stmt_to_prepare = s_to_prepare -> data ;
399
+ stmt = s -> data ;
412
400
}
413
401
414
402
{
@@ -422,13 +410,13 @@ MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * const s, const char * const
422
410
}
423
411
}
424
412
425
- if (FAIL == mysqlnd_stmt_read_prepare_response (s_to_prepare )) {
413
+ if (FAIL == mysqlnd_stmt_read_prepare_response (s )) {
426
414
goto fail ;
427
415
}
428
416
429
- if (stmt_to_prepare -> param_count ) {
430
- if (FAIL == mysqlnd_stmt_skip_metadata (s_to_prepare ) ||
431
- FAIL == mysqlnd_stmt_prepare_read_eof (s_to_prepare ))
417
+ if (stmt -> param_count ) {
418
+ if (FAIL == mysqlnd_stmt_skip_metadata (s ) ||
419
+ FAIL == mysqlnd_stmt_prepare_read_eof (s ))
432
420
{
433
421
goto fail ;
434
422
}
@@ -439,51 +427,31 @@ MYSQLND_METHOD(mysqlnd_stmt, prepare)(MYSQLND_STMT * const s, const char * const
439
427
Beware that SHOW statements bypass the PS framework and thus they send
440
428
no metadata at prepare.
441
429
*/
442
- if (stmt_to_prepare -> field_count ) {
443
- MYSQLND_RES * result = conn -> m -> result_init (stmt_to_prepare -> field_count );
430
+ if (stmt -> field_count ) {
431
+ MYSQLND_RES * result = conn -> m -> result_init (stmt -> field_count );
444
432
if (!result ) {
445
433
SET_OOM_ERROR (conn -> error_info );
446
434
goto fail ;
447
435
}
448
436
/* Allocate the result now as it is needed for the reading of metadata */
449
- stmt_to_prepare -> result = result ;
437
+ stmt -> result = result ;
450
438
451
439
result -> conn = conn -> m -> get_reference (conn );
452
440
453
441
result -> type = MYSQLND_RES_PS_BUF ;
454
442
455
443
if (FAIL == result -> m .read_result_metadata (result , conn ) ||
456
- FAIL == mysqlnd_stmt_prepare_read_eof (s_to_prepare ))
444
+ FAIL == mysqlnd_stmt_prepare_read_eof (s ))
457
445
{
458
446
goto fail ;
459
447
}
460
448
}
461
449
462
- if (stmt_to_prepare != stmt ) {
463
- /* swap */
464
- size_t real_size = sizeof (MYSQLND_STMT ) + mysqlnd_plugin_count () * sizeof (void * );
465
- char * tmp_swap = mnd_emalloc (real_size );
466
- memcpy (tmp_swap , s , real_size );
467
- memcpy (s , s_to_prepare , real_size );
468
- memcpy (s_to_prepare , tmp_swap , real_size );
469
- mnd_efree (tmp_swap );
470
- {
471
- MYSQLND_STMT_DATA * tmp_swap_data = stmt_to_prepare ;
472
- stmt_to_prepare = stmt ;
473
- stmt = tmp_swap_data ;
474
- }
475
- s_to_prepare -> m -> dtor (s_to_prepare , TRUE);
476
- }
477
450
stmt -> state = MYSQLND_STMT_PREPARED ;
478
451
DBG_INF ("PASS" );
479
452
DBG_RETURN (PASS );
480
453
481
454
fail :
482
- if (stmt_to_prepare != stmt && s_to_prepare ) {
483
- s_to_prepare -> m -> dtor (s_to_prepare , TRUE);
484
- }
485
- stmt -> state = MYSQLND_STMT_INITTED ;
486
-
487
455
DBG_INF ("FAIL" );
488
456
DBG_RETURN (FAIL );
489
457
}
0 commit comments