On Thu, Oct 05, 2006 at 12:21:17PM -0700, Henri Asseily wrote:
> On Oct 5, 2006, at 6:19 AM, Tim Bunce wrote:
> 
> >>Say I have a dbh with an active sth.
> >>I create a new dbh (new_dbh) and swap its inner handle with dbh.
> >>
> >>Now is sth a child of dbh or new_dbh? i.e., is sth linked to the
> >>inner dbh, or not at all?
> >
> >It remains linked with the original inner dbh which has been swapped
> >into new_dbh.
> 
> Ok.
> 
> >>Then I create a new sth (new_sth) and swap its inner handle with sth.
> >
> >Is the new sth created from dbh or new_dbh?
> 
> It's created from dbh, but after it was swapped with new_dbh (i.e.  
> it's created with the outer dbh and inner new_dbh).
> 
> >>What happens?
> >
> >The sth will be a child of the (inner) dbh you used to create it.
> 
> Ok so now sth and new_sth are children of the same inner dbh, and no  
> reparenting is being done when I swap them.
> 
> >[It's clear that the lack of a terminology/nomenclature makes it  
> >harder to think about and discuss what's happening.]
> 
> My thoughts exactly :)

Let's try this and see how it works out:

Original state:
        dbh1o -> dbh1i
        sthAo -> sthAi(dbh1i)
        dbh2o -> dbh2i

swap_inner_handle dbh1o with dbh2o:
        dbh2o -> dbh1i
        sthAo -> sthAi(dbh1i)
        dbh1o -> dbh2i

create new sth from dbh1o:
        dbh2o -> dbh1i
        sthAo -> sthAi(dbh1i)
        dbh1o -> dbh2i
        sthBo -> sthBi(dbh2i)

swap_inner_handle sthAo with sthBo:
        dbh2o -> dbh1i
        sthBo -> sthAi(dbh1i)
        dbh1o -> dbh2i
        sthAo -> sthBi(dbh2i)

Does that fit your expectations?

> >Since you ask the question I assume you may have a problem.
> >Looking at the code I can see one potential issue...
> >
> >Handles include a reference to their parent's _outer_ handle.
> >The code doesn't do anything about that but should in two cases:
> >1. If the parents of the handles being swapped differ, and the
> >   allow_reparent parameter is true.
> >2. Any existing child handles of the two handles being swapped
> >   should have their parent handle references updated.
> >
> >I'll assume the second one is the cause of the problem I'm assuming  
> >you have.
> >As far as I can tell from a quick look, that would affect:
> > - How the Statement attribute gets copied from sth to parent dbh.
> > - How the 'last used handle' is updated by DESTROY
> >
> >Are my assumptions correct?
> 
> It was less of seeing a problem, and more of "what is the One True  
> Way of using swap_inner_handle":
> I have dbh with sth, then I create new_dbh and swap with dbh. I then  
> create new_sth and swap with sth.
> Then I undef'd new_sth and new_dbh.
> From what you're saying, because I get rid of new_dbh and new_sth  
> that were "polluted", I shouldn't be hit with the 2 issues you're  
> talking about.

I think you're okay because you don't do anything with the old handles
(except destroy them).

Tim.

> (For those who wonder what we're talking about, playing this game  
> allows one to reconnect and reexecute a statement with the requesting  
> code knowing nothing about what's being done. It thinks it executed a  
> statement successfully when in fact "the shit hit the fan" in the  
> backend, and we had to connect to a new database and reexecute the  
> statement)
> 
> H
> 

Reply via email to