<br><br>
<div><span class="gmail_quote">2008/7/17, Hakan Mattsson <<a href="mailto:hakan@erix.ericsson.se">hakan@erix.ericsson.se</a>>:</span>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">On Thu, 17 Jul 2008, devdoer bird wrote:<br><br>db> Hi:<br>db> I can use transform_table  to upgrade the table schema in mnesia.<br>
db><br>db> Eg.The version 1 of user record's defination is<br>db><br>db> -record(user_v1,{uuid,name})<br>db><br>db> I want to upgrade the user table to version 2<br>db><br>db> -record(user_v2,{uuid,name,email}).<br>
db><br>db> I can use transform_table like this:<br>db><br>db>  transform_table(user,fun({user_v1,Uuid,Name})->#user_v2{uuid=Uuid,name=Name,email=""}<br>db> end,record_info(fields,user_v2),user_v2).<br>
db><br>db> My question is<br>db> 1. while the upgrade is in in progress, is the user record I read  either<br>db> the version 1 or the version 2 ?That is I can't  be sure one user record's<br>db> current version.<br>
db> 2. while the upgrade is in progress,will the modify  of the old user record<br>db> be lost?<br><br>It will differ per module and process. During the upgrade you may have<br>some processes that are using the old module and some are using the<br>
new module. If this is an issue, you need to perform a more advanced<br>upgrade procedure that first suspends the processes, then loads the<br>new code and finaly resumes the processes.</blockquote>
<div> </div>
<div>I can't understand. Won't one process read either version 1 or version 2?</div>
<div>Eg. there're 5 user records of version 1 intially, when I do transform_table,there may</div>
<div>be 3 user records of version 1,and 2 user records of version 2 if the transform_table operation is not finished yet.</div><br>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">db> 3. If the 1 and 2 are true,how can I  code two handle them? Shall I have to<br>db> have two versions of process code to handle this situation ,like:<br>
db> process_one_user(UserRecord)-><br>db>    case of current_version(UserRecord) of<br>db>         v1-> do something;<br>db>         v2->do  something<br>db>      end<br>db> end<br><br>One way of getting better control of this, is to change the name of the record.<br>
Then it will be easy to test which "version" of the record that you are using.<br>See also mnesia:transform_table/4.</blockquote>
<div> </div>
<div>If I do so,many codes rely on the original record name will be changed, and I have to code in  if-else style in many place .Am I right?</div><br>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">/Håkan<br>---<br>Håkan Mattsson (uabhams)<br>Erlang/OTP, Ericsson<br>_______________________________________________<br>
erlang-questions mailing list<br><a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br><a href="http://www.erlang.org/mailman/listinfo/erlang-questions">http://www.erlang.org/mailman/listinfo/erlang-questions</a><br>
</blockquote></div><br>