Re: Chainvayler
hakan eryargi <[email protected]> Sat, 25 Apr 2020 13:42:58 +0200
| Newsgroups | gmane.comp.java.prevayler |
|---|---|
| Message-ID | <CAPg-4YWqrz5Tcd2W=ssxpquyPrg9pZbN4uOSzYMVU3fFfFP+1A@mail.gmail.com> |
--===============4466346390223166154==
Content-Type: multipart/alternative; boundary="00000000000070867505a41bfc4d"
--00000000000070867505a41bfc4d
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Thanks Rick :)
Those are two very different projects and might be better delivered as
> separate things, even though you can turn them off independently
I'm targeting enterprise domain and they need both. Postvayler, predecessor
of Chainvayler, was doing transparent persistence. But enterprise need
scalability or at least redundancy. So it was on the back of my mind for
long time for how to replicate this. Either one (replication/persistence)
has their own specific use cases, possibly persistence a lot more, like all
desktop applications can benefit from it, but for the overall goal,
eliminating databases, we need replication and persistence at the same
time.
Adoption and interest are so hard to generate.
So true indeed.
It feels like many people don=E2=80=99t have the vision or look deeper, or =
maybe
I=E2=80=99m very biased and exaggerating the possible value.
What could you build, dirt simple, that would get people excited about the
> possibility.
I was thinking similar, so a few years ago spent some time and adapted
Spring's famous "pet clinic" sample to Postvayler. It integrates with
Spring's load time weaving mechanism and persistence root can be
@Autowired.
https://github.com/raftAtGit/spring-petclinic
Many additional things are possible here. For example, autowiring Chained
non root objects based on JsonPath (or XPath) like syntax. For example:
@RequestMapping("/deposit/{accountId}")
void depositMoney(
@PathVariable int accountId,
@Path("$.bank.account[{accountId}]") Account account) {
// account with accountId will be injected. as long as Bank
class has a Map, getAccount(int) method or similar.
account.deposit(amount);
}
But these are just additional benefits. Not directly related to
Postvayler/Chainvayler. That's why I didnt even mention them in the blog.
I believe, if it ever happens, the breaking point will happen when some
large and/or famous company uses Chainvayler in a real life project, and
proves it can actually be used to eliminate databases, provides much better
performance and reduce development costs.
Best,
Hakan
On Fri, Apr 24, 2020 at 7:44 PM Rick Ross <[email protected]> wrote:
> I like the concept a lot. Isn't the dream to just annotate objects for
> persistence and whatever rules you need to apply? To marry that to a
> shared model across JVMs is very interesting.
>
>
> My first thoughts are :
>
> Those are two very different projects and might be better delivered as
> separate things, even though you can turn them off independently
>
> Adoption and interest are so hard to generate. Without them, it's just a
> personal project. I mean no offense by that, but success breeds success=
.
> We've all been there. What could you build, dirt simple, that would get
> people excited about the possibility.
>
> My first thought there is the classic LAMP stack needs one less
> letter, right?
>
> It strikes me that with persistence managed entirely as objects, it
> wouldn't be to hard to autogenerate basic crud REST calls. Once you hav=
e
> annotated your object, it is automatically REST available, with full crud=
.
>
>
> Or perhaps a connector that could work with Angular and provide safe
> persistent storage, right off the bat.
>
>
> Just spitballing here. I'll keep tabs on this though. It's interesting=
.
>
>
> Rick
>
>
>
> On 4/22/20 11:35 PM, hakan eryargi wrote:
>
> Hey guys,
>
> Remember my PoC project *Postvayler* many years ago? It was making POJOs
> persistent transparently based on @annotations and of course Prevayler.
>
> Recently I took the idea one step forward and extended the mechanism to
> also replicate POJOs among JVMs.
>
> Here is my blog post about it:
>
> https://medium.com/@hakan.eryargi/transparent-replication-and-persistence=
-for-pojo-graphs-805d9ae0f776
>
>
> Here is the project *Chainvayler* itself:
> https://github.com/raftAtGit/Chainvayler
>
> Personally I find the idea really promising :)
>
> Cheers,
> Hakan (r a f t)
>
> PS: I'm somehow got out from the email list, re-registered myself.
>
> On Mon, Dec 2, 2013 at 12:12 AM hakan eryargi <[email protected]>
> wrote:
>
>> i'm experimenting with the idea. so far not bad. just put what I've done
>> to GitHub. any suggestions, critics and contributions are welcome:)
>> https://github.com/raftAtGit/Postvayler
>>
>> apologies for the name, it sounded like a nice word play:)
>>
>> to run the sample, run the Compiler class
>> with raft.postvayler.samples.bank.Bank argument and then run
>> raft.postvayler.samples.bank.Main
>>
>> how it works:
>> compiler injects bytecode to root class and all @Persistent classes that
>> can be accesible* from root.
>>
>> root class contains an injected object pool, where each @Persistent clas=
s
>> is assigned a Long id and put into this object pool when created. this p=
ool
>> will be* a WeakValueMap so objects which are not attached to root will b=
e
>> garbage collected at some time.
>>
>> each @Persist method in a @Persistent class is instrumented like this:
>> @Persist
>> ReturnType doSomething(someParams) {..}
>>
>> doSomehing is copied to __postvayler__doSomething(..). the original doSo=
mehing
>> becomes:
>>
>> ReturnType doSomething(someParams) {
>> if (!there is postvayler context)
>> return __postvayler__doSomething(..);
>> if (we are in a prevayler transaction)
>> return __postvayler__doSomething(..);
>> return prevayler.execute(new MethodTransaction(..));
>> }
>>
>> the arguments to doSomehing(..) is transformed in MethodTransaction such
>> that references to @Persistent objects are replaced with Reference's,
>> which will later be restored from object pool. seems as this also solves
>> the Baptism problem.
>>
>> looks good to me for now:)
>>
>> cheers,
>> *r a f t*
>>
>> * not implemented yet
>>
>> On Wed, Nov 27, 2013 at 11:07 AM, Naveen Chawla <[email protected]>
>> wrote:
>>
>>> Sure, here:
>>> http://docs.oracle.com/javase/tutorial/java/generics/methods.html
>>>
>>> As for consistency, any multi-changes explicitly synchronized over
>>> prevalentObject can be auto-batched.
>>>
>>>
>>> On 27 November 2013 00:25, Klaus Wuestefeld <[email protected]> wrote:
>>>
>>>> > It is ordinary generic method syntax.
>>>>
>>>> Could you point me to some doc on this syntax? I couldnt find it here:
>>>> http://docs.oracle.com/javase/tutorial/extra/generics/methods.html
>>>>
>>>> > The beginning and end of a transaction would simply be any change to
>>>> any
>>>> > non-transient field.
>>>>
>>>> Suppose a transaction needs to update two fields to be correct but the
>>>> system crashes after the first. Will the system not be inconsistent on
>>>> recovery?
>>>>
>>>> Klaus
>>>>
>>>>
>>>> ----------------------------------------------------------------------=
--------
>>>> Rapidly troubleshoot problems before they affect your business. Most I=
T
>>>> organizations don't have a clear picture of how application performanc=
e
>>>> affects their revenue. With AppDynamics, you get 100% visibility into
>>>> your
>>>> Java,.NET, & PHP application. Start your 15-day FREE TRIAL of
>>>> AppDynamics Pro!
>>>>
>>>> http://pubads.g.doubleclick.net/gampad/clk?id=3D84349351&iu=3D/4140/os=
tg.clktrk
>>>> _______________________________________________
>>>> To unsubscribe go to the end of this page:
>>>> http://lists.sourceforge.net/lists/listinfo/prevayler-discussion
>>>> _______________________________________________
>>>> "Databases in Memoriam" -- http://www.prevayler.org
>>>>
>>>
>>>
>>>
>>> -----------------------------------------------------------------------=
-------
>>> Rapidly troubleshoot problems before they affect your business. Most IT
>>> organizations don't have a clear picture of how application performance
>>> affects their revenue. With AppDynamics, you get 100% visibility into
>>> your
>>> Java,.NET, & PHP application. Start your 15-day FREE TRIAL of
>>> AppDynamics Pro!
>>>
>>> http://pubads.g.doubleclick.net/gampad/clk?id=3D84349351&iu=3D/4140/ost=
g.clktrk
>>> _______________________________________________
>>> To unsubscribe go to the end of this page:
>>> http://lists.sourceforge.net/lists/listinfo/prevayler-discussion
>>> _______________________________________________
>>> "Databases in Memoriam" -- http://www.prevayler.org
>>>
>>>
>>
>
> _______________________________________________
> To unsubscribe go to the end of this page: http://lists.sourceforge.net/l=
ists/listinfo/prevayler-discussion
> _______________________________________________
> "Databases in Memoriam" -- http://www.prevayler.org
>
>
--00000000000070867505a41bfc4d
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div dir=3D"ltr">Thanks Rick :)<div><br></div><blockquote =
class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px sol=
id rgb(204,204,204);padding-left:1ex">Those are two very different projects=
and might be better delivered as separate things, even though you can turn=
them off independently</blockquote><div>=C2=A0</div><div>I'm targeting=
enterprise domain and they need both. Postvayler, predecessor of Chainvayl=
er, was doing transparent persistence. But enterprise need scalability or a=
t least redundancy. So it was on the back of my mind for long time for how =
to replicate this. Either one (replication/persistence) has their own speci=
fic use cases, possibly persistence a lot more, like all desktop applicatio=
ns can benefit=C2=A0from it, but for the overall goal, eliminating database=
s, we need=C2=A0
replication and persistence at the same time.</div><div><br></div><blockquo=
te class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px =
solid rgb(204,204,204);padding-left:1ex">Adoption and interest are so hard =
to generate.=C2=A0=C2=A0</blockquote><div>=C2=A0</div><div>So true indeed. =
<br><br>It feels like many people don=E2=80=99t have the vision or look dee=
per, or maybe I=E2=80=99m very biased and exaggerating the possible value.<=
br></div><div><br><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px=
0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">What co=
uld you build, dirt simple, that would get people excited about the possibi=
lity. =C2=A0=C2=A0</blockquote><div>=C2=A0</div></div><div>I was thinking s=
imilar, so a few years ago spent some time and adapted Spring's famous =
"pet clinic" sample to Postvayler. It integrates with Spring'=
s load time weaving mechanism and persistence root can be @Autowired. <br><=
a href=3D"https://github.com/raftAtGit/spring-petclinic" target=3D"_blank">=
https://github.com/raftAtGit/spring-petclinic</a>=C2=A0=C2=A0<br></div><div=
><br></div>Many additional things are possible here. For example, autowirin=
g Chained non root objects based on JsonPath (or XPath) like syntax. For ex=
ample:<div><pre style=3D"color:rgb(85,85,85);font-size:13px">@RequestMappin=
g("/deposit/{accountId}")
void depositMoney(
@PathVariable int accountId,=20
@Path("$.bank.account[{accountId}]") Account account) {
// account with accountId will be injected. as long as Bank class ha=
s a Map, getAccount(int) method or similar.
account.deposit(amount);
}</pre>But these are just additional benefits. Not directly related to Post=
vayler/Chainvayler. That's why I didnt=C2=A0even mention them in the bl=
og.</div><div><br></div><div>I believe, if it ever happens, the breaking po=
int will happen when some large and/or famous company uses Chainvayler in a=
real life project, and proves it can actually be used to eliminate databas=
es, provides much better performance and reduce development costs.=C2=A0</d=
iv><div><br></div>Best,<br>Hakan<div>=C2=A0</div></div><br><div class=3D"gm=
ail_quote"><div dir=3D"ltr" class=3D"gmail_attr">On Fri, Apr 24, 2020 at 7:=
44 PM Rick Ross <<a href=3D"mailto:[email protected]" target=3D"_blank">ric=
[email protected]</a>> wrote:<br></div><blockquote class=3D"gmail_quote" style=
=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding=
-left:1ex">
=20
=20
=20
<div>
<p>I like the concept a lot.=C2=A0=C2=A0 Isn't the dream to just an=
notate
objects for persistence and whatever rules you need to apply?=C2=A0=
=C2=A0=C2=A0=C2=A0
To marry that to a shared model across JVMs is very interesting.<br>
</p>
<p><br>
</p>
<p>My first thoughts are :=C2=A0=C2=A0 <br>
</p>
<p>Those are two very different projects and might be better
delivered as separate things, even though you can turn them off
independently<br>
</p>
<p>Adoption and interest are so hard to generate.=C2=A0 Without them,
it's just a personal project.=C2=A0=C2=A0 I mean no offense by th=
at, but
success breeds success.=C2=A0 We've all been there.=C2=A0 What co=
uld you
build, dirt simple, that would get people excited about the
possibility.=C2=A0 <br>
</p>
<p>=C2=A0=C2=A0=C2=A0 My first thought there is the classic LAMP stack =
needs one
less letter, right?=C2=A0=C2=A0 <br>
</p>
<p>=C2=A0=C2=A0=C2=A0 It strikes me that with persistence managed entir=
ely as
objects, it wouldn't be to hard to autogenerate basic crud REST
calls. =C2=A0 Once you have annotated your object, it is automaticall=
y
REST available, with full crud. =C2=A0=C2=A0 <br>
</p>
<p>=C2=A0=C2=A0=C2=A0 Or perhaps a connector that could work with Angul=
ar and
provide safe persistent storage, right off the bat.=C2=A0=C2=A0=C2=A0=
<br>
</p>
<p><br>
</p>
<p>Just spitballing here.=C2=A0=C2=A0 I'll keep tabs on this though=
.=C2=A0 It's
interesting.</p>
<p><br>
</p>
<p>Rick</p>
<p><br>
</p>
<p><br>
</p>
<div>On 4/22/20 11:35 PM, hakan eryargi
wrote:<br>
</div>
<blockquote type=3D"cite">
=20
<div dir=3D"ltr">
<div dir=3D"ltr">
<div>Hey guys,</div>
<div><br>
</div>
<div>Remember my PoC project <b>Postvayler</b> many
years=C2=A0ago? It was making POJOs persistent transparently
based on=C2=A0@annotations and of course Prevayler.</div>
<div><br>
</div>
<div>Recently I took the idea one step forward and extended
the mechanism to also replicate POJOs among JVMs.</div>
<div><br>
</div>
<div>Here is my blog post about it:</div>
<div><a href=3D"https://medium.com/@hakan.eryargi/transparent-rep=
lication-and-persistence-for-pojo-graphs-805d9ae0f776" target=3D"_blank">ht=
tps://medium.com/@hakan.eryargi/transparent-replication-and-persistence-for=
-pojo-graphs-805d9ae0f776</a>=C2=A0</div>
<div><br>
</div>
<div>Here is the project <b>Chainvayler</b> itself:=C2=A0<br>
</div>
<div><a href=3D"https://github.com/raftAtGit/Chainvayler" target=
=3D"_blank">https://github.com/raftAtGit/Chainvayler</a>=C2=A0</div>
<div><br>
</div>
<div>Personally I find the idea really promising :)</div>
<div><br>
</div>
<div>Cheers,</div>
<div>Hakan (r a f t)=C2=A0</div>
<div><br>
</div>
<div>PS: I'm somehow got out from the email list,
re-registered myself.</div>
</div>
<br>
<div class=3D"gmail_quote">
<div dir=3D"ltr" class=3D"gmail_attr">On Mon, Dec 2, 2013 at 12:1=
2
AM hakan eryargi <<a href=3D"mailto:[email protected]"=
target=3D"_blank">[email protected]</a>>
wrote:<br>
</div>
<blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8=
ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div dir=3D"ltr">i'm experimenting with the idea. so far no=
t
bad. just put what I've done to GitHub. any suggestions,
critics and contributions are welcome:)
<div><a href=3D"https://github.com/raftAtGit/Postvayler" targ=
et=3D"_blank">https://github.com/raftAtGit/Postvayler</a></div>
<div><br>
</div>
<div>apologies for the name, it=C2=A0sounded like a nice word
play:)<br>
</div>
<div><br>
</div>
<div>
<div>to run the sample, run the Compiler class
with=C2=A0raft.postvayler.samples.bank.Bank argument and
then run raft.postvayler.samples.bank.Main</div>
<div><br>
</div>
<div>how it works:</div>
<div>compiler injects bytecode to root class and all
@Persistent=C2=A0classes that can be accesible* from root=
.=C2=A0</div>
<div>
<div class=3D"gmail_extra"><br>
</div>
<div class=3D"gmail_extra">root class contains an
injected object pool, where each @Persistent class
is assigned a Long id and put into this object pool
when created. this pool will be* a WeakValueMap so
objects which are not attached to root will be
garbage collected at some time.</div>
<div class=3D"gmail_extra"><br>
</div>
<div class=3D"gmail_extra">each @Persist method in
a=C2=A0@Persistent class is instrumented like this:</di=
v>
<div class=3D"gmail_extra"><font face=3D"courier new,
monospace">@Persist</font></div>
<div class=3D"gmail_extra">
<font face=3D"courier new, monospace">ReturnType
doSomething(someParams) {..}</font></div>
<div class=3D"gmail_extra"><br>
</div>
<div class=3D"gmail_extra"><font face=3D"courier new,
monospace">doSomehing </font>is copied to <font face=
=3D"courier new, monospace">__postvayler__doSomething(..)</font>.
the original <font face=3D"courier new, monospace">doSo=
mehing
</font>becomes:<br>
</div>
<div class=3D"gmail_extra"><br>
</div>
<div class=3D"gmail_extra"><font face=3D"courier new,
monospace">ReturnType=C2=A0doSomething(someParams) {<=
/font></div>
<div class=3D"gmail_extra"><font face=3D"courier new,
monospace">=C2=A0 =C2=A0 if (!there is postvayler con=
text)=C2=A0</font></div>
<div class=3D"gmail_extra"><font face=3D"courier new,
monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0 return
__postvayler__doSomething(..);</font></div>
<div class=3D"gmail_extra"><font face=3D"courier new,
monospace">=C2=A0 =C2=A0 if (we are in a prevayler
transaction)=C2=A0</font></div>
<div class=3D"gmail_extra"><font face=3D"courier new,
monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0 return
__postvayler__doSomething(..);</font></div>
<div class=3D"gmail_extra"><font face=3D"courier new,
monospace">=C2=A0 =C2=A0 return prevayler.execute(new
MethodTransaction(..));</font></div>
<div class=3D"gmail_extra"><font face=3D"courier new,
monospace">}<br>
</font></div>
<div class=3D"gmail_extra"><br>
</div>
<div class=3D"gmail_extra">the arguments to
doSomehing(..) is transformed in <font face=3D"courier =
new, monospace">MethodTransaction </font>such
that references to @Persistent objects are replaced
with <font face=3D"courier new, monospace">Reference=
9;</font><font face=3D"arial, helvetica, sans-serif">s</font>,
which will later be restored from object pool. seems
as this also solves the Baptism problem.=C2=A0</div>
<div class=3D"gmail_extra"><br>
</div>
<div class=3D"gmail_extra">looks good to me for now:)</di=
v>
<div class=3D"gmail_extra"><br>
</div>
<div class=3D"gmail_extra">cheers,</div>
<div class=3D"gmail_extra"><i>r a f t</i></div>
<div class=3D"gmail_extra">
<br>
</div>
<div class=3D"gmail_extra">* not implemented yet</div>
<div class=3D"gmail_extra"><br>
<div class=3D"gmail_quote">On Wed, Nov 27, 2013 at
11:07 AM, Naveen Chawla <span dir=3D"ltr"><<a href=
=3D"mailto:[email protected]" target=3D"_blank">[email protected]</=
a>></span>
wrote:<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0px=
0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div dir=3D"ltr">Sure, here:=C2=A0<a href=3D"http:/=
/docs.oracle.com/javase/tutorial/java/generics/methods.html" target=3D"_bla=
nk">http://docs.oracle.com/javase/tutorial/java/generics/methods.html</a>
<div>
<br>
</div>
<div>As for consistency, any multi-changes
explicitly synchronized over prevalentObject
can be auto-batched.</div>
</div>
<div>
<div>
<div class=3D"gmail_extra"><br>
<br>
<div class=3D"gmail_quote">On 27 November
2013 00:25, Klaus Wuestefeld <span dir=3D"l=
tr"><<a href=3D"mailto:[email protected]" target=3D"_blank">[email protected]<=
/a>></span>
wrote:<br>
<blockquote class=3D"gmail_quote" style=3D"=
margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-lef=
t:1ex">
<div>> It is ordinary generic
method syntax.<br>
<br>
</div>
Could you point me to some doc on this
syntax? I couldnt find it here:<br>
<a href=3D"http://docs.oracle.com/javase/=
tutorial/extra/generics/methods.html" target=3D"_blank">http://docs.oracle.=
com/javase/tutorial/extra/generics/methods.html</a><br>
<div><br>
> The beginning and end of a
transaction would simply be any
change to any<br>
> non-transient field.<br>
<br>
</div>
Suppose a transaction needs to update
two fields to be correct but the<br>
system crashes after the first. Will
the system not be inconsistent on<br>
recovery?<br>
<div>
<div><br>
Klaus<br>
<br>
---------------------------------------------------------------------------=
---<br>
Rapidly troubleshoot problems
before they affect your business.
Most IT<br>
organizations don't have a clear
picture of how application
performance<br>
affects their revenue. With
AppDynamics, you get 100%
visibility into your<br>
Java,.NET, & PHP application.
Start your 15-day FREE TRIAL of
AppDynamics Pro!<br>
<a href=3D"http://pubads.g.doubleclic=
k.net/gampad/clk?id=3D84349351&iu=3D/4140/ostg.clktrk" target=3D"_blank=
">http://pubads.g.doubleclick.net/gampad/clk?id=3D84349351&iu=3D/4140/o=
stg.clktrk</a><br>
_______________________________________________<br>
To unsubscribe go to the end of
this page: <a href=3D"http://lists.so=
urceforge.net/lists/listinfo/prevayler-discussion" target=3D"_blank">http:/=
/lists.sourceforge.net/lists/listinfo/prevayler-discussion</a><br>
_______________________________________________<br>
"Databases in Memoriam" -- =
<a href=3D"http://www.prevayler.org" target=3D"_blank">http://www.prevayler=
.org</a><br>
</div>
</div>
</blockquote>
</div>
<br>
</div>
</div>
</div>
<br>
---------------------------------------------------------------------------=
---<br>
Rapidly troubleshoot problems before they affect
your business. Most IT<br>
organizations don't have a clear picture of how
application performance<br>
affects their revenue. With AppDynamics, you get
100% visibility into your<br>
Java,.NET, & PHP application. Start your
15-day FREE TRIAL of AppDynamics Pro!<br>
<a href=3D"http://pubads.g.doubleclick.net/gampad/c=
lk?id=3D84349351&iu=3D/4140/ostg.clktrk" target=3D"_blank">http://pubad=
s.g.doubleclick.net/gampad/clk?id=3D84349351&iu=3D/4140/ostg.clktrk</a>=
<br>
_______________________________________________<br>
To unsubscribe go to the end of this page: <a href=
=3D"http://lists.sourceforge.net/lists/listinfo/prevayler-discussion" targe=
t=3D"_blank">http://lists.sourceforge.net/lists/listinfo/prevayler-discussi=
on</a><br>
_______________________________________________<br>
"Databases in Memoriam" -- <a href=3D"htt=
p://www.prevayler.org" target=3D"_blank">http://www.prevayler.org</a><br>
<br>
</blockquote>
</div>
<br>
</div>
</div>
</div>
</div>
</blockquote>
</div>
</div>
<br>
<fieldset></fieldset>
<br>
<fieldset></fieldset>
<pre>_______________________________________________
To unsubscribe go to the end of this page: <a href=3D"http://lists.sourcefo=
rge.net/lists/listinfo/prevayler-discussion" target=3D"_blank">http://lists=
.sourceforge.net/lists/listinfo/prevayler-discussion</a>
_______________________________________________
"Databases in Memoriam" -- <a href=3D"http://www.prevayler.org" t=
arget=3D"_blank">http://www.prevayler.org</a>
</pre>
</blockquote>
</div>
</blockquote></div>
</div>
--00000000000070867505a41bfc4d--
--===============4466346390223166154==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
--===============4466346390223166154==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline
_______________________________________________
To unsubscribe go to the end of this page: http://lists.sourceforge.net/lists/listinfo/prevayler-discussion
_______________________________________________
"Databases in Memoriam" -- http://www.prevayler.org
--===============4466346390223166154==--