modeling-users Mailing List for Object-Relational Bridge for python (Page 6)
Status: Abandoned
Brought to you by:
sbigaret
You can subscribe to this list here.
2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(2) |
Sep
(3) |
Oct
|
Nov
|
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2003 |
Jan
(19) |
Feb
(55) |
Mar
(54) |
Apr
(48) |
May
(41) |
Jun
(40) |
Jul
(156) |
Aug
(56) |
Sep
(90) |
Oct
(14) |
Nov
(41) |
Dec
(32) |
2004 |
Jan
(6) |
Feb
(57) |
Mar
(38) |
Apr
(23) |
May
(3) |
Jun
(40) |
Jul
(39) |
Aug
(82) |
Sep
(31) |
Oct
(14) |
Nov
|
Dec
(9) |
2005 |
Jan
|
Feb
(4) |
Mar
(13) |
Apr
|
May
(5) |
Jun
(2) |
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
(1) |
2006 |
Jan
(1) |
Feb
(1) |
Mar
(9) |
Apr
(1) |
May
|
Jun
(1) |
Jul
(5) |
Aug
|
Sep
(5) |
Oct
(1) |
Nov
|
Dec
|
2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(2) |
Nov
(1) |
Dec
|
2009 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(4) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2011 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Mario R. <ma...@ru...> - 2004-08-23 09:06:35
|
On Aug 20, 2004, at 9:06 PM, Kertis, Dennis wrote: > Is there a way to tell Modeling to only fetch the first N rows?=A0=20 > Ideally, I'd like to be able to specify an offset and a count to do=20 > something like paging results of a search. > > Thanks, > > Dennis Hi, there were a few discussions on this a while back, including a=20 pretty well-defined proposal to add offset and paging capabilities.=20 Sebastien had also worked on it in a branch, but I do not know what the=20= status of that is now. Search the mailing list archive for "offset"...=20= but the main thread about this was: API cleanup proposal =A0 http://sourceforge.net/mailarchive/message.php?msg_id=3D5142917 limiting the amount of objects retrieved =A0 http://sourceforge.net/mailarchive/message.php?msg_id=3D7163083 limit http://sourceforge.net/mailarchive/message.php?msg_id=3D4159154 mario= |
From: Kertis, D. <dk...@vo...> - 2004-08-20 19:06:44
|
Is there a way to tell Modeling to only fetch the first N rows? Ideally, I'd like to be able to specify an offset and a count to do something like paging results of a search. Thanks, Dennis |
From: Marco B. <m.b...@ic...> - 2004-08-19 07:38:56
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Sebastien Bigaret wrote: | Hi, | | To all: I'll probably be off for a day or two from now, so | do not expect me to answer quickly in this period ;) No problem :) | Marco Bizzarri wrote: | |>Pfeeww... I didn't expect such a looong answer... :) | | | This will be very short one, before a more complete in the coming days. | I just want to correct something quickly: | | [...] | |>In a web environment, like Zope or whatever, you've a clear |>distinction of a transaction: the arrive of a request, the |>sending of response. All inside these two events can be |>considered a transaction; at least, this is what the user can |>perceive as a transaction. | | [...] | |>| Back on this, just a few words: having a single |>BEGIN/COMMIT or ABORT |>| per zope transaction means that you want to restrict what the |>| framework is able to do. Updates in an EC can take more |>than one zope |>| transaction to be achieved, for example if they are saved after |>| several html pages have been served one after the other (think of a |>| wizard, at the end of which you confirm or cancel the changes). |> |>I don't think this is possible in the current integration of |>MDL and Zope. |> |>IIRC, MDL register itself with the _finish method... |> |>~ def _finish(self): |>~ self.ec.lock() |>~ self.ec.saveChanges() |>~ self.ec.unlock() |> |>Now, this means that, at the end of *each* Zope transaction |>you will do a saveChanges on your ec. Therefore, if you |>update your objects inside the page of the wizard, they will |>be stored on the RDB. | | | | No, a session's EC is NOT bound by default to the zope TM, | (even if the _finish() method is used when it is bound to it) | cf. section 6.4. & 6.4.1 in the User's Guide. If you observed | the oppposite this is definitely a bug that should be fixed. No, I was assuming the bind_saveChanges_to_zope_transactions behaviour. | So, basically, you should get exactly what you describe: | |>The above behaviour could be configurable. You could have an |>"auto-commit" EC and a "non-auto-commit" EC (i.e. different |>subclasses), and let the developer choose according to its need. | | | based on the ZEditingContextSessioning's property | 'bind_saveChanges_to_zope_transactions'. It IS possible to | decorrelate EC.saveChanges() and the zope TM, it should even | be the default (or, I repeat, this is definitely a bug). | | [...] | |>Also, even though you could in principle do some |>saveChanges() by yourself, this would be looking for havoc. |>Indeed, Zope relies on the fact that a transaction can be |>redone from the start, if something goes wrong. | | | Zope does not insist to rely on this if you insist of ignoring | its TM ;) I disagree. Zope itself uses a conflict resolution approach, where, aside from interactions with the RDB, you can have ConflictErrors, which are raised, catched by the ZPublisher which redo the transaction from the beginning. | Seriously, it's possible to build a whole application on this principle. [...] This is a point which is very interesting to me. However, I think you could be very limited on what you can use inside Zope... ZCatalogs, for example, should be exluded, because they can easily generate ReadConflictError. However, I suspect you have much more experience on this topic than me, and I would appreciate your point of view. | |>I think I should review a little... consider an application |>where you have a large number of users, 1000, perhaps, each |>having its own ec... should we notify each user of the changes? | | | Wow, I only meant notifying the ECs, not the users ;) unless you decide | so, obviously. | [...] Of course, my wording was not that good. If I have 1000 users active, I have 1000 sessions, with 1000 EC. I could have to notify to 999 EC when one makes a change... or not? | | Hopefully this succeeds some of my points in the previsou email | a little clearer. Again, yes, this would be a lot clearer with a tutorial, | a zope dedicated section and a sample toy application... I would be happy to contribute something on this point... | -- Sébastien. Regards Marco -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFBJFkLXhfyAQQVoaIRAt3DAJ9hGUCP0LE821psO9UZSQip8dsVBQCfcwYX 0crnvRdxieb384XpvloS+fg= =j+Jq -----END PGP SIGNATURE----- |
From: Sebastien B. <sbi...@us...> - 2004-08-18 20:14:42
|
Hi, To all: I'll probably be off for a day or two from now, so do not expect me to answer quickly in this period ;) Marco Bizzarri wrote: > Pfeeww... I didn't expect such a looong answer... :) This will be very short one, before a more complete in the coming days. I just want to correct something quickly: [...] > In a web environment, like Zope or whatever, you've a clear > distinction of a transaction: the arrive of a request, the > sending of response. All inside these two events can be > considered a transaction; at least, this is what the user can > perceive as a transaction. [...] > | Back on this, just a few words: having a single > BEGIN/COMMIT or ABORT > | per zope transaction means that you want to restrict what the > | framework is able to do. Updates in an EC can take more > than one zope > | transaction to be achieved, for example if they are saved after > | several html pages have been served one after the other (think of a > | wizard, at the end of which you confirm or cancel the changes). > > I don't think this is possible in the current integration of > MDL and Zope. > > IIRC, MDL register itself with the _finish method... > > ~ def _finish(self): > ~ self.ec.lock() > ~ self.ec.saveChanges() > ~ self.ec.unlock() > > Now, this means that, at the end of *each* Zope transaction > you will do a saveChanges on your ec. Therefore, if you > update your objects inside the page of the wizard, they will > be stored on the RDB. No, a session's EC is NOT bound by default to the zope TM, (even if the _finish() method is used when it is bound to it) cf. section 6.4. & 6.4.1 in the User's Guide. If you observed the oppposite this is definitely a bug that should be fixed. So, basically, you should get exactly what you describe: > The above behaviour could be configurable. You could have an > "auto-commit" EC and a "non-auto-commit" EC (i.e. different > subclasses), and let the developer choose according to its need. based on the ZEditingContextSessioning's property 'bind_saveChanges_to_zope_transactions'. It IS possible to decorrelate EC.saveChanges() and the zope TM, it should even be the default (or, I repeat, this is definitely a bug). [...] > Also, even though you could in principle do some > saveChanges() by yourself, this would be looking for havoc. > Indeed, Zope relies on the fact that a transaction can be > redone from the start, if something goes wrong. Zope does not insist to rely on this if you insist of ignoring its TM ;) Seriously, it's possible to build a whole application on this principle. E.g. you can design a whole application after the MVC model, with the V/C part being handled by zpt/python Products and the M part being handled by plain pure-python modules --which saveChanges() at some point, completely decorrelated from the zope transaction machinery. And the whole zope machinery is then just used for its "regular" application server (serving pages, load-balancing between threads, handling sessions, etc.) > I think I should review a little... consider an application > where you have a large number of users, 1000, perhaps, each > having its own ec... should we notify each user of the changes? Wow, I only meant notifying the ECs, not the users ;) unless you decide so, obviously. To be clear, in my language, notifications are only a way to inform the different ECs so that a (programmatic) decision can be made on what should be done (merge changes, discard changes, etc.) --see the Notification Framework for details! Just because something has to be done, even if this "something" ultimately means "do nothing/ignore the changes" in some situations :) Hopefully this succeeds some of my points in the previsou email a little clearer. Again, yes, this would be a lot clearer with a tutorial, a zope dedicated section and a sample toy application... -- Sébastien. |
From: Marco B. <m.b...@ic...> - 2004-08-18 16:02:35
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Pfeeww... I didn't expect such a looong answer... :) Let's see.. Sebastien Bigaret wrote: | Marco Bizzarri wrote: | |>|>When you need to look for the DB log, it is useful to spot the |>|>problems by mean of ABORTed transactions. If the aborted |>|>transactions are the standard, this can be a problem. |>| |>| Understood, this seems reasonable. I think this could be |>| controlled by an option / env. variable / whatever |>| |> |>That would be great :) | | | Ok, we're going that way then. Could you submit a RFE @sf.net? | That would make it sure I won't forget... https://sourceforge.net/tracker/index.php?func=detail&aid=1011515&group_id=58935&atid=489338 | [...] | |>| Could you be a little more explicit on your use-case(s)? |>| I'm curious here, and I'd like to better understand what your needs |>| are / could be in terms of finer control on transactions. |> |>Up to now we have used SQL transactions inside the Zope TM. |>This means that, for each request/response, you've just one |>transaction, which is either commited or aborted. |> |>The Modeling Framework, on the other hand, would perform |>several transactions on RDBMS, | | | Right, and the main reason is that they do not work at the same level. | The Zope TM usually directly "impacts" rdbms databases. | The MDL framework on the other side works at the object level: you | make whatever changes you need to make on a graph of objects, then | you save them as a bunch (and here, obviously,inside a single | transaction) --that's the saveChanges() stuff. And if you have | a situation where there can be several saveChanges() *before* the | decision is made on whether they should be permanently saved into | the database, then the parent/child EC configuration is for you | (you can consider such configurations as sub-transactions at the | object level). | | Okay, enough with that --it was probably off-topic here, | but I took the opportunity to make it clear, just in case ;) | | Yes, but I think there is another point (please forgive me if I'm repeating the same things you're saying). In a web environment, like Zope or whatever, you've a clear distinction of a transaction: the arrive of a request, the sending of response. All inside these two events can be considered a transaction; at least, this is what the user can perceive as a transaction. In non zope (I would say non web based) programming, the boundaries of the transactions are more difficult to be pointed. Indeed, the boundaries are of two kinds: 1) read transactions, each having its own RDB transaction; 2) write transactions, which are directly activated by the developer (with saveChanges()) [...] | | Okay, I think I see the point now, I'll try to rephrase it, you'll | correct me if I misunderstood. | | First, let's consider you have a single transaction per thread: you | probably agree that a problem remains --different problem, but still | a problem: | | a. thread-1 fetches customer (and leave the transaction opened) | b. thread-2 modifies customers and orders | c. thread-1 fetches orders, not seeing changes made in b. | | Then, what should thread-1 do? (ok, the "not seeing changes made in b." | actually depends on the db, the cursor's isolation level, ...) Ok, I'm assuming serialization isolation level. Inside a single transaction, I think you will end having some serialization error (it depends on your changes, but you should). | You may not have the problem of inconsistency between data fetched | during step a. and c., but still there remains the problem of answering | the question "what should thread-1 do?" Refresh the (possibly already | modified) data fetched during step a.? Discard any modifications and | retry the whole stuff? Or else...? Yes, this is a problem, and, as you correctly stated, this is a different. problem. Actually, this is a classic "business transaction problem", and it is not limited to the case we are discussing. A tipical would be: 1) user 1 reads Customer C, and has a page to modify it. 2) user 2 actually modifies it 3) user 1 modifies the page and submits the page. What should be done? First of all, we would have to detect the problem, and this can be done with different methods (version numbers, timestamps, etc.) Then, the application will inform the user, who will have to decide what to do. | |>Actually, I would not having to deal with RDBMS transactions |>at all. Instead, I would prefer to see a single BEGIN/COMMIT, |>or BEGIN/ABORT for each of my Zope Transaction. | | | As far as I can understand, your problem is not with transactions, but | with inconsistencies that can occur in data retrieved from the db when it | is concurrently accessed and modified, is that right? Yes, it is. | Currently (as of release 0.9pre17), each EC currently ignores the | changes done by others. This means, in particular, that if ec1 and ec2 | fetch then save the same object, the one that saves its changes last | overrides the other one changes. | | Now if you want every EC to be notified (hence, at the object level) of | not only _when_ an EC saves its changes, but also _what_ the changes are, | then the 'optimistic locking' patch available at @sf.net is for you :) | | --> Search the archives, we discussed this in detail not a long time ago, | I believe it was w/ Duncan and Ernesto, and as far as I remember Duncan | uses it successfully since it's been posted. | (the patch will probably be included in the next release) I will take a look at the patch, thanks :) | BTW, the way an EC is notified of changes is not documented neither in | the messages nor in the patch, but it's there; and the default behaviour | this patch proposes is, roughly: ec1 and ec2 fetch() an object, ec2 | modifies then saves it, ec1 gets the modifications, applies them then | re-applies the changes that has been made in its own scope, if | appropriate. | | Could such a mechanism be of some help? I guess so, if I did not | misunderstood your point, since in particular it would offer an | automatic way of being notified of changes concurrently made so that | a decision can be made on what should be done (possibly depending on | the situation, on which objects are involved, etc.) I think I should review a little... consider an application where you have a large number of users, 1000, perhaps, each having its own ec... should we notify each user of the changes? | |>Actually, I would not having to deal with RDBMS transactions |>at all. Instead, I would prefer to see a single BEGIN/COMMIT, |>or BEGIN/ABORT for each of my Zope Transaction. | | | Back on this, just a few words: having a single BEGIN/COMMIT or ABORT | per zope transaction means that you want to restrict what the | framework is able to do. Updates in an EC can take more than one zope | transaction to be achieved, for example if they are saved after several | html pages have been served one after the other (think of a wizard, at | the end of which you confirm or cancel the changes). I don't think this is possible in the current integration of MDL and Zope. IIRC, MDL register itself with the _finish method... ~ def _finish(self): ~ self.ec.lock() ~ self.ec.saveChanges() ~ self.ec.unlock() Now, this means that, at the end of *each* Zope transaction you will do a saveChanges on your ec. Therefore, if you update your objects inside the page of the wizard, they will be stored on the RDB. Also, even though you could in principle do some saveChanges() by yourself, this would be looking for havoc. Indeed, Zope relies on the fact that a transaction can be redone from the start, if something goes wrong. | I can understand that you feel uncomfortable with several | db-transactions occuring during a single zope transaction, but now if | the inconsistencies can be solved at the object level with full control | of what should be done (or a reasonable default behaviour), would the | discomfort eventually remain? I've to see the Optimistic lock patch before answering. I confess I'm probably too much Zope-oriented. However, I would explore this possibility: 1) when a first fetch is done on an EC, the EC, if it has not done yet, opens a RDB transaction; 2) whenever you have a saveChanges(), the EC either opens and then commits the transaction, or simply commit the transaction. The above behaviour could be configurable. You could have an "auto-commit" EC and a "non-auto-commit" EC (i.e. different subclasses), and let the developer choose according to its need. | | | -- Sébastien. Thanks for your support. Regards Marco -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFBI31yXhfyAQQVoaIRAgx6AJ9WzgmDLTEYWQw8H6mL64MdhvGn/gCfdb4y Gel67mlAS0o1pQvgEr+3hvQ= =iAGJ -----END PGP SIGNATURE----- |
From: Mario R. <ma...@ru...> - 2004-08-18 15:50:12
|
On Jul 19, 2004, at 9:00 PM, Sebastien Bigaret wrote: > the framework does not anymore relies that heavily on code > generation, but how could you know since this hasn't been publicly > announced yet :/ ... (esp. because it's not fully documented) > > --> dynamic, on-the-fly creation of package is available in the last > release 0.9pre17; look for a file named doc/README.dynamic.txt, > also > available here: > http://cvs.sourceforge.net/viewcvs.py/modeling/ProjectModeling/ > Modeling/doc/README.dynamic.txt?rev=1.1&view=auto I have just played with this, just very little... what I'd like to know more about is why the 3 ways of using Modeling.dynamic? It is not clear to me... and: - it seems more code complications, that someone must maintain ;( - more documentation, that someone must write, and maintain ;( - more documentation, that someone must understand ;( - not pythonic... as "there is no clear and obvious way to do it"... When you get the time, could you say a little more about the rationale for these 3 ways, and, if these ways are not explorative and temporary (will "standardize" on one way in the future...), what are the advantages of one way over another, and when would you use one and not the other? > Using that feature allows you to bypass the modification of the needed > code since dynamic generation will always use your model to dynamically > create your classes. Just a little note, Ernesto Revilla reported some > problems regarding properties and inheritance, so you may not want to > use properties right now; more details in Ernesto's original post here: > https://sourceforge.net/mailarchive/forum.php? > thread_id=5035017&forum_id=10674 These problems apply only to the first way, or to all three? > Feel free to ask for more if some points remain obscure! ;-) mario |
From: Sebastien B. <sbi...@us...> - 2004-08-18 14:57:52
|
"Kertis, Dennis" <dk...@vo...> wrote: > Actually, I had that in my model but got this error: > > Serious: couldn't load the model > exceptions.ValueError > invalid literal for int(): * > > Here is the code: > > <relation > name='topics' > destinationEntity='Topic' > deleteRule='2' > multiplicityLowerBound='0' > multiplicityUpperBound='*' > thanks, > Dennis That's definitely a bug. Try '-1' instead of '*'! Thanks for reporting. -- Sébastien. |
From: Sebastien B. <sbi...@us...> - 2004-08-18 14:56:16
|
Marco Bizzarri wrote: > |>When you need to look for the DB log, it is useful to spot the > |>problems by mean of ABORTed transactions. If the aborted > |>transactions are the standard, this can be a problem. > | > | Understood, this seems reasonable. I think this could be > | controlled by an option / env. variable / whatever > | > > That would be great :) Ok, we're going that way then. Could you submit a RFE @sf.net? That would make it sure I won't forget... [...] > | Could you be a little more explicit on your use-case(s)? > | I'm curious here, and I'd like to better understand what your needs > | are / could be in terms of finer control on transactions. > > Up to now we have used SQL transactions inside the Zope TM. > This means that, for each request/response, you've just one > transaction, which is either commited or aborted. > > The Modeling Framework, on the other hand, would perform > several transactions on RDBMS, Right, and the main reason is that they do not work at the same level. The Zope TM usually directly "impacts" rdbms databases. The MDL framework on the other side works at the object level: you make whatever changes you need to make on a graph of objects, then you save them as a bunch (and here, obviously,inside a single transaction) --that's the saveChanges() stuff. And if you have a situation where there can be several saveChanges() *before* the decision is made on whether they should be permanently saved into the database, then the parent/child EC configuration is for you (you can consider such configurations as sub-transactions at the object level). Okay, enough with that --it was probably off-topic here, but I took the opportunity to make it clear, just in case ;) > > This could be a problem since I could see, inside a > transaction, possibily different values for the same row. Of > course I could decide to manage directly these issues, but I > would prefer to have them handled by the Modeling Framework. > > Let's say I've two classes, Customer and Order. The > association is one to many from Customer to Order. > > Now let's say I'm retrieve a Customer C, using an ec.fetch(), > which causes an RDBMS transaction. After this, another > thread commits something, modifying both the Customer and its > orders. I then retrieve the Orders, which is another RDBMS > transaction. Data on the order are up to date, but not on the > Customer. Okay, I think I see the point now, I'll try to rephrase it, you'll correct me if I misunderstood. First, let's consider you have a single transaction per thread: you probably agree that a problem remains --different problem, but still a problem: a. thread-1 fetches customer (and leave the transaction opened) b. thread-2 modifies customers and orders c. thread-1 fetches orders, not seeing changes made in b. Then, what should thread-1 do? (ok, the "not seeing changes made in b." actually depends on the db, the cursor's isolation level, ...) You may not have the problem of inconsistency between data fetched during step a. and c., but still there remains the problem of answering the question "what should thread-1 do?" Refresh the (possibly already modified) data fetched during step a.? Discard any modifications and retry the whole stuff? Or else...? > Actually, I would not having to deal with RDBMS transactions > at all. Instead, I would prefer to see a single BEGIN/COMMIT, > or BEGIN/ABORT for each of my Zope Transaction. As far as I can understand, your problem is not with transactions, but with inconsistencies that can occur in data retrieved from the db when it is concurrently accessed and modified, is that right? Currently (as of release 0.9pre17), each EC currently ignores the changes done by others. This means, in particular, that if ec1 and ec2 fetch then save the same object, the one that saves its changes last overrides the other one changes. Now if you want every EC to be notified (hence, at the object level) of not only _when_ an EC saves its changes, but also _what_ the changes are, then the 'optimistic locking' patch available at @sf.net is for you :) --> Search the archives, we discussed this in detail not a long time ago, I believe it was w/ Duncan and Ernesto, and as far as I remember Duncan uses it successfully since it's been posted. (the patch will probably be included in the next release) BTW, the way an EC is notified of changes is not documented neither in the messages nor in the patch, but it's there; and the default behaviour this patch proposes is, roughly: ec1 and ec2 fetch() an object, ec2 modifies then saves it, ec1 gets the modifications, applies them then re-applies the changes that has been made in its own scope, if appropriate. Could such a mechanism be of some help? I guess so, if I did not misunderstood your point, since in particular it would offer an automatic way of being notified of changes concurrently made so that a decision can be made on what should be done (possibly depending on the situation, on which objects are involved, etc.) > Actually, I would not having to deal with RDBMS transactions > at all. Instead, I would prefer to see a single BEGIN/COMMIT, > or BEGIN/ABORT for each of my Zope Transaction. Back on this, just a few words: having a single BEGIN/COMMIT or ABORT per zope transaction means that you want to restrict what the framework is able to do. Updates in an EC can take more than one zope transaction to be achieved, for example if they are saved after several html pages have been served one after the other (think of a wizard, at the end of which you confirm or cancel the changes). I can understand that you feel uncomfortable with several db-transactions occuring during a single zope transaction, but now if the inconsistencies can be solved at the object level with full control of what should be done (or a reasonable default behaviour), would the discomfort eventually remain? -- Sébastien. |
From: Mario R. <ma...@ru...> - 2004-08-18 14:32:29
|
On Aug 13, 2004, at 12:27 AM, Sebastien Bigaret wrote: > Mario Ruggier wrote: > [...] >> Another situation in which this could apply is for migrating from one >> db+model to another... a little modeling mapping code could read from >> one EC and populate another that uses a modified model. This may not >> be the most efficient to way to do this, but possibly the most >> flexible and one that would guarantee data integrity and consistency >> the most. Any opinions on whether this would be a good idea or not? > > I'm sure we've played with that idea some day in the past, if I > remember well it > was probably with Yannick Gingras (I can't check the archives right > now). > > The problem is that, while this sounds interesting, this could > probably only be done with small databases --because, unless we > want to automatically analyse a model in detail, handling > relationships will end up in loading a whole database in memory. OK, as things are it sounds like that in practice it will not be the way to go. It would be difficult to guarantee that the object graph of the target EC will stay within a certain size... before the target model integrity is respected and one could actually do a saveChanges()... > Moreover, I'm convinced that it will be difficult to cover every > transformations. But I can be proved wrong! Well, I assume that the transformation logic itself will be written case-per-case... looping over the tables and their relationships, copying/maping them from one EC to another. There should not be any limitations there... python is pretty capable ;) Anyhow, w.r.t. the initial argument of this thread, what you suggest, i.e. to dynamically create as many models as you need but with class names done with Table_ID, seems rather opaque and awkward to me... How big of shaker would it be to give the EditingContext control over which database it is working with? Even if it is the same model and entity namespace in memory, why not allow the EditingContext to specify its connection dictionary? i.e. ec1 = EditingContext(connDict1) ec2 = EditingContext(connDict2) I guess EditingContext could also grow an optional model parameter... for when the system will support more than the defaultModel. For EditingContexts that inherit from another, they would need to exist in the same db context, so they will be obliged to use their parent's connection dictionary... In fact this reminds me of a remark some months ago, about extracting the connection dictionary out of the model altogether, where I had claimed, without really substantiating it, that it does not seem that that is where the connection dictionary belongs... ;) mario |
From: Kertis, D. <dk...@vo...> - 2004-08-18 13:03:05
|
Actually, I had that in my model but got this error: Serious: couldn't load the model exceptions.ValueError invalid literal for int(): * Here is the code: <relation=20 name=3D'topics' destinationEntity=3D'Topic' deleteRule=3D'2' multiplicityLowerBound=3D'0' multiplicityUpperBound=3D'*' thanks, Dennis -----Original Message----- From: Sebastien Bigaret [mailto:sbi...@us...]=20 Sent: Wednesday, August 18, 2004 5:45 AM To: Kertis, Dennis Cc: mod...@li... Subject: Re: [Modeling-users] One to Many Relationships Hi Dennis, The problem is that you forgot to indicate in your model that it is a to-many relationship, so the script reacts as if it was a to-one relationship. See section 2.5.5. in the User's Guide; a unbound = to-many relationship typically defines: multiplicityLowerBound=3D'0' multiplicityUpperBound=3D'*' (in your case you got the default values, i.e. respectively '0' and=20 '1', defining a to-one relationship) Please also note that there is currently nothing in the framework that makes sure that your XML-models does not rely on defaults that have changed between two releases (this is not the case for PyModels, which defines a 'version' field for this very purpose, see section 2.4.4). The reason why there is no such mechanism is that the xml model is not supposed to rely on defaults... even if I fear that this is not said at all in the User's Guide. It does NOT mean you should always specify every possible fields in your xml model: it just means that you should be careful. When in = doubt, you can easily have your model dumped in another xml model with all its value defined: >>> from Modeling.Model import loadModel >>> model=3DloadModel('your_model.xml') >>> model.saveModelAsXMLFile('FULLY_QUALIFIED_MODEL.xml') Just a little warning: be sure to give an other filename, or you'll overwrite your own model! -- S=E9bastien. Kertis, Dennis wrote: > I am trying to define a one-to-many relationship in XML. However, > I am getting the following error: >=20 > Object: Relationship Category.topics > ------------------------------------ > * Error(s): > - relationship is not mandatory but source attribute Category.id > is required > > Can anyone tell me the correct way to model a one-to-many with = Modeling? > My "many" table has a foreign key to the primary key of my "one" = table, > but modeling doesn't seem to like this. > > Below is a cutdown of my model. >=20 > <entity > name=3D'Topic'> > <primaryKey attributeName=3D'id'/> > <attribute=20 > name=3D'id' > type=3D'int' > isRequired=3D'1'/> > <attribute=20 > name=3D'categoryID' > type=3D'int' > isRequired=3D'1'/> > </entity> > <entity > name=3D'Category' > <primaryKey attributeName=3D'id'/> > <attribute=20 > name=3D'id' > type=3D'int' > isClassProperty=3D'0'=20 > isRequired=3D'1'/> > <relation=20 > name=3D'topics' > destinationEntity=3D'Topic'> > <join=20 > sourceAttribute=3D'id' > destinationAttribute=3D'categoryID'/> > </relation> > </entity> |
From: Mario R. <ma...@ru...> - 2004-08-18 12:54:36
|
On Aug 18, 2004, at 11:37 AM, Lorenzo Gil Sanchez wrote: > El mar, 17-08-2004 a las 23:08, seb...@nu... escribi=F3: >> >> I think that the pb. here is that the root package, named >> after the model's package nale (here: 'Person' AFAIK) isn't >> in the python path. >> >> Could you check whether you get the same error with >> /home/lgs/proyectos/pruebas-modeling/ >> in your PYTHONPATH (before '.', in case you have in the py-path), >> and report back? Thanks. > > I still get the same error: > > [lgs@localhost pruebas-modeling]$ export > PYTHONPATH=3D.:/opt/lib/python2.3/site-packages/ > > [lgs@localhost pruebas-modeling]$ python model_person.py > Traceback (most recent call last): > File "model_person.py", line 33, in ? > from Person.Customer import Customer > File "/home/lgs/proyectos/pruebas-modeling/Person/Customer.py", line > 2, in ? > from MDL.Customer import Customer as MDL_Customer_Customer > File "/home/lgs/proyectos/pruebas-modeling/Person/MDL/Customer.py", > line 5, in ? > from Person.Person import Person > ImportError: No module named Person It may well be a bug... from what I can understand there seems to be a=20= name-clash problem between the package and the contained modules... if=20= you modify your package name (that, if not specified, is taken from the=20= model name) to something else, e.g. PymPerson, and then adjust your=20 code as follows: import sys sys.path.insert(0,'.') # if running in dir containing the generated=20= PymPerson package... print sys.path from Modeling.EditingContext import EditingContext from PymPerson.Person import Person from PymPerson.Customer import Customer ec =3D EditingContext() p =3D Person() p.setName('Erny') ec.insert(p) c =3D Customer() c.setName('Lorenzo') c.setPhone('93923924') ec.insert(c) print ec.fetch('Person',isDeep=3D1) then, it works as expected... Sebastien, can you can you confirm when=20 you get around to it whether this is actually a bug? mario |
From: Marco B. <m.b...@ic...> - 2004-08-18 11:29:46
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Sebastien Bigaret wrote: | Hi, | | Marco Bizzarri wrote: [...] |>When you need to look for the DB log, it is useful to spot the |>problems by mean of ABORTed transactions. If the aborted transactions |>are the standard, this can be a problem. | | | Understood, this seems reasonable. I think this could be controlled by | an option / env. variable / whatever | That would be great :) |>|>2) how are the db transaction executed/completed inside a Zope |>|>transaction? In a non-zope application, I can see each fetch() |>|>produces a transaction, as well as the ec.saveChanges(). Is this |>|>true also in Zope applications? |>| |>| Yes it is. The zope support basically consists in providing a |>| default EditingContext per session, possibly also connecting this |>| EC's saveChanges() to the transaction machinery (i.e. to |>| request/response loop). That's all, and everything else will be |>| handled in your ZProducts' code, just the same way you would make it |>| in pure python. |>| |>| Hope this helps |> |>Yes and no... I would prefer to be able to tell ModelingFramework when |>it should start/stop a transaction on the db... howevr, thanks of the |>answer... | | | Could you be a little more explicit on your use-case(s)? | I'm curious here, and I'd like to better understand what your needs are | / could be in terms of finer control on transactions. Up to now we have used SQL transactions inside the Zope TM. This means that, for each request/response, you've just one transaction, which is either commited or aborted. The Modeling Framework, on the other hand, would perform several transactions on RDBMS, This could be a problem since I could see, inside a transaction, possibily different values for the same row. Of course I could decide to manage directly these issues, but I would prefer to have them handled by the Modeling Framework. Let's say I've two classes, Customer and Order. The association is one to many from Customer to Order. Now let's say I'm retrieve a Customer C, using an ec.fetch(), which causes an RDBMS transaction. After this, another thread commits something, modifying both the Customer and its orders. I then retrieve the Orders, which is another RDBMS transaction. Data on the order are up to date, but not on the Customer. Actually, I would not having to deal with RDBMS transactions at all. Instead, I would prefer to see a single BEGIN/COMMIT, or BEGIN/ABORT for each of my Zope Transaction. | -- Sébastien. Regards Marco -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.4 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFBIz2DXhfyAQQVoaIRAj4FAJ9Lf7OMeTO9GhdfVmGUkzSL5tVbTwCdGuKF 50IZki3s5k7I8Vsf+NjmmqI= =ZzDr -----END PGP SIGNATURE----- |
From: Sebastien B. <sbi...@us...> - 2004-08-18 09:47:55
|
Okay --I cannot check this right now, I'll get back to you on it in a couple of days, probably during the next week-end or on monday. -- Sébastien. Lorenzo Gil Sanchez <lg...@si...> wrote: > El mar, 17-08-2004 a las 23:08, sbi...@us... escribió: > > > > I think that the pb. here is that the root package, named > > after the model's package nale (here: 'Person' AFAIK) isn't > > in the python path. > > > > Could you check whether you get the same error with > > /home/lgs/proyectos/pruebas-modeling/ > > in your PYTHONPATH (before '.', in case you have in the py-path), > > and report back? Thanks. > > I still get the same error: > > [lgs@localhost pruebas-modeling]$ export > PYTHONPATH=.:/opt/lib/python2.3/site-packages/ > > [lgs@localhost pruebas-modeling]$ python model_person.py > Traceback (most recent call last): > File "model_person.py", line 33, in ? > from Person.Customer import Customer > File "/home/lgs/proyectos/pruebas-modeling/Person/Customer.py", line > 2, in ? > from MDL.Customer import Customer as MDL_Customer_Customer > File "/home/lgs/proyectos/pruebas-modeling/Person/MDL/Customer.py", > line 5, in ? > from Person.Person import Person > ImportError: No module named Person |
From: Sebastien B. <sbi...@us...> - 2004-08-18 09:44:45
|
Hi Dennis, The problem is that you forgot to indicate in your model that it is a to-many relationship, so the script reacts as if it was a to-one relationship. See section 2.5.5. in the User's Guide; a unbound to-many relationship typically defines: multiplicityLowerBound='0' multiplicityUpperBound='*' (in your case you got the default values, i.e. respectively '0' and '1', defining a to-one relationship) Please also note that there is currently nothing in the framework that makes sure that your XML-models does not rely on defaults that have changed between two releases (this is not the case for PyModels, which defines a 'version' field for this very purpose, see section 2.4.4). The reason why there is no such mechanism is that the xml model is not supposed to rely on defaults... even if I fear that this is not said at all in the User's Guide. It does NOT mean you should always specify every possible fields in your xml model: it just means that you should be careful. When in doubt, you can easily have your model dumped in another xml model with all its value defined: >>> from Modeling.Model import loadModel >>> model=loadModel('your_model.xml') >>> model.saveModelAsXMLFile('FULLY_QUALIFIED_MODEL.xml') Just a little warning: be sure to give an other filename, or you'll overwrite your own model! -- Sébastien. Kertis, Dennis wrote: > I am trying to define a one-to-many relationship in XML. However, > I am getting the following error: > > Object: Relationship Category.topics > ------------------------------------ > * Error(s): > - relationship is not mandatory but source attribute Category.id > is required > > Can anyone tell me the correct way to model a one-to-many with Modeling? > My "many" table has a foreign key to the primary key of my "one" table, > but modeling doesn't seem to like this. > > Below is a cutdown of my model. > > <entity > name='Topic'> > <primaryKey attributeName='id'/> > <attribute > name='id' > type='int' > isRequired='1'/> > <attribute > name='categoryID' > type='int' > isRequired='1'/> > </entity> > <entity > name='Category' > <primaryKey attributeName='id'/> > <attribute > name='id' > type='int' > isClassProperty='0' > isRequired='1'/> > <relation > name='topics' > destinationEntity='Topic'> > <join > sourceAttribute='id' > destinationAttribute='categoryID'/> > </relation> > </entity> |
From: Lorenzo G. S. <lg...@si...> - 2004-08-18 09:38:07
|
El mar, 17-08-2004 a las 23:08, seb...@nu... escribió: > > I think that the pb. here is that the root package, named > after the model's package nale (here: 'Person' AFAIK) isn't > in the python path. > > Could you check whether you get the same error with > /home/lgs/proyectos/pruebas-modeling/ > in your PYTHONPATH (before '.', in case you have in the py-path), > and report back? Thanks. I still get the same error: [lgs@localhost pruebas-modeling]$ export PYTHONPATH=.:/opt/lib/python2.3/site-packages/ [lgs@localhost pruebas-modeling]$ python model_person.py Traceback (most recent call last): File "model_person.py", line 33, in ? from Person.Customer import Customer File "/home/lgs/proyectos/pruebas-modeling/Person/Customer.py", line 2, in ? from MDL.Customer import Customer as MDL_Customer_Customer File "/home/lgs/proyectos/pruebas-modeling/Person/MDL/Customer.py", line 5, in ? from Person.Person import Person ImportError: No module named Person |
From: Lorenzo G. S. <lg...@si...> - 2004-08-18 08:43:40
|
Sorry about this. Obviously I forgot to insert it on the EditingContext as Mario also reminded me. Stupid mistake. Thanks Lorenzo El mar, 17-08-2004 a las 23:10, Sebastien Bigaret escribió: > > You should get both objects with isDeep=1, right... > but before that, you need to 'ec.insert(c)' as well ;) > > -- Sébastien. > > > Lorenzo Gil Sanchez wrote: > > Hi again :-) > > > > Using the dynamic module (from CVS) I was able to create the > > Python classes of my model, which uses inheritance: > > > > My model has two entities: Person and Customer, which > > inherits from Person. > > > > My problem now is related to fetches. I have two instances on my > > EditingContext: a person and a customer: > > > > ec = EditingContext() > > p = Person() > > p.setName('Erny') > > ec.insert(p) > > print p > > > > c = Customer() > > c.setName('Lorenzo') > > c.setPhone('93923924') > > print c > > > > Now, how do I get all the person in my editing context? > > > > query = ec.fetch('Person', isDeep=1) > > print len(query) > > 1 > > > > As you can see I'm getting one object when I should been > > getting two since the Customer is-a Person > > > > Am I doing something wrong or I just hit a bug? > > > > I'll attach the whole code so everybody can test it. > > > > Regards > > > > Lorenzo > > > > > > ------------------------------------------------------- > SF.Net email is sponsored by Shop4tech.com-Lowest price on Blank Media > 100pk Sonic DVD-R 4x for only $29 -100pk Sonic DVD+R for only $33 > Save 50% off Retail on Ink & Toner - Free Shipping and Free Gift. > http://www.shop4tech.com/z/Inkjet_Cartridges/9_108_r285 > _______________________________________________ > Modeling-users mailing list > Mod...@li... > https://lists.sourceforge.net/lists/listinfo/modeling-users |
From: Kertis, D. <dk...@vo...> - 2004-08-18 06:02:29
|
I am trying to define a one-to-many relationship in XML. However, I am getting the following error: Object: Relationship Category.topics ------------------------------------ * Error(s): - relationship is not mandatory but source attribute Category.id is required Can anyone tell me the correct way to model a one-to-many with Modeling? My "many" table has a foreign key to the primary key of my "one" table, but modeling doesn't seem to like this. Below is a cutdown of my model. <entity name='Topic'> <primaryKey attributeName='id'/> <attribute name='id' type='int' isRequired='1'/> <attribute name='categoryID' type='int' isRequired='1'/> </entity> <entity name='Category' <primaryKey attributeName='id'/> <attribute name='id' type='int' isClassProperty='0' isRequired='1'/> <relation name='topics' destinationEntity='Topic'> <join sourceAttribute='id' destinationAttribute='categoryID'/> </relation> </entity> |
From: <seb...@nu...> - 2004-08-17 22:55:56
|
I think that the pb. here is that the root package, named after the model's package nale (here: 'Person' AFAIK) isn't in the python path. Could you check whether you get the same error with /home/lgs/proyectos/pruebas-modeling/ in your PYTHONPATH (before '.', in case you have in the py-path), and report back? Thanks. (I can't check it here right now, despite the fact that you send us the whole code, sorry). -- Sébastien. Lorenzo Gil Sanchez wrote: > > I have a pymodel written in a file and after creating the > database and the python classes (mdl_generate_DB_schema.py > and mdl_generate_python_code -B) I try to run some basic code > and I get this > exception: > > Traceback (most recent call last): > File "model_person.py", line 33, in ? > from Person.Customer import Customer > File > "/home/lgs/proyectos/pruebas-modeling/Person/Customer.py", > line 2, in ? > from MDL.Customer import Customer as MDL_Customer_Customer > File "/home/lgs/proyectos/pruebas-modeling/Person/MDL/Customer.py", > line 5, in ? > from Person.Person import Person > ImportError: No module named Person > > It looks like the problem arises when using Inheritance. In > my model, the Customer entity inherits from the Person > entity. The python code generated by modeling tryies to > import Person when defining Customer and it can't find it. > > I think a possible solution would be to modify the > __init__.py file of the package modeling is generating so it > imports all the domain classes generated. > [sample code snipped] |
From: Sebastien B. <sbi...@us...> - 2004-08-17 22:54:09
|
Hi, Marco Bizzarri wrote: [...] > Sebastien Bigaret wrote: > |>Also, I've noticed that the ec.fetch() is a transaction which > |>terminates with an abort. Is this correct? > | > | > | This is intentional, anyhow ;) Such a transaction should be > | terminated, and I cannot see any reason why it should be COMMITed, > | hence it is ABORTed! But if you think differently, please let us > | know! > > One of the basic reason for this is in the debugging/maintenance of > the system. > > When you need to look for the DB log, it is useful to spot the > problems by mean of ABORTed transactions. If the aborted transactions > are the standard, this can be a problem. Understood, this seems reasonable. I think this could be controlled by an option / env. variable / whatever > |>2) how are the db transaction executed/completed inside a Zope > |>transaction? In a non-zope application, I can see each fetch() > |>produces a transaction, as well as the ec.saveChanges(). Is this > |>true also in Zope applications? > | > | Yes it is. The zope support basically consists in providing a > | default EditingContext per session, possibly also connecting this > | EC's saveChanges() to the transaction machinery (i.e. to > | request/response loop). That's all, and everything else will be > | handled in your ZProducts' code, just the same way you would make it > | in pure python. > | > | Hope this helps > > Yes and no... I would prefer to be able to tell ModelingFramework when > it should start/stop a transaction on the db... howevr, thanks of the > answer... Could you be a little more explicit on your use-case(s)? I'm curious here, and I'd like to better understand what your needs are / could be in terms of finer control on transactions. -- Sébastien. |
From: Mario R. <ma...@ru...> - 2004-08-17 22:33:47
|
On Aug 17, 2004, at 5:16 PM, Lorenzo Gil Sanchez wrote: > c = Customer() > c.setName('Lorenzo') > c.setPhone('93923924') > print c You are forgetting to ec.insert(c)... For your previous mail about inheritance problem, wait until Seb is back to confirm whether it is actually a bug or not... mario |
From: Sebastien B. <sbi...@us...> - 2004-08-17 22:13:58
|
You should get both objects with isDeep=1, right... but before that, you need to 'ec.insert(c)' as well ;) -- Sébastien. Lorenzo Gil Sanchez wrote: > Hi again :-) > > Using the dynamic module (from CVS) I was able to create the > Python classes of my model, which uses inheritance: > > My model has two entities: Person and Customer, which > inherits from Person. > > My problem now is related to fetches. I have two instances on my > EditingContext: a person and a customer: > > ec = EditingContext() > p = Person() > p.setName('Erny') > ec.insert(p) > print p > > c = Customer() > c.setName('Lorenzo') > c.setPhone('93923924') > print c > > Now, how do I get all the person in my editing context? > > query = ec.fetch('Person', isDeep=1) > print len(query) > 1 > > As you can see I'm getting one object when I should been > getting two since the Customer is-a Person > > Am I doing something wrong or I just hit a bug? > > I'll attach the whole code so everybody can test it. > > Regards > > Lorenzo > |
From: Lorenzo G. S. <lg...@si...> - 2004-08-17 18:42:16
|
Hi again :-) Using the dynamic module (from CVS) I was able to create the Python classes of my model, which uses inheritance: My model has two entities: Person and Customer, which inherits from Person. My problem now is related to fetches. I have two instances on my EditingContext: a person and a customer: ec = EditingContext() p = Person() p.setName('Erny') ec.insert(p) print p c = Customer() c.setName('Lorenzo') c.setPhone('93923924') print c Now, how do I get all the person in my editing context? query = ec.fetch('Person', isDeep=1) print len(query) 1 As you can see I'm getting one object when I should been getting two since the Customer is-a Person Am I doing something wrong or I just hit a bug? I'll attach the whole code so everybody can test it. Regards Lorenzo |
From: Lorenzo G. S. <lg...@si...> - 2004-08-17 15:12:19
|
I have a pymodel written in a file and after creating the database and the python classes (mdl_generate_DB_schema.py and mdl_generate_python_code -B) I try to run some basic code and I get this exception: Traceback (most recent call last): File "model_person.py", line 33, in ? from Person.Customer import Customer File "/home/lgs/proyectos/pruebas-modeling/Person/Customer.py", line 2, in ? from MDL.Customer import Customer as MDL_Customer_Customer File "/home/lgs/proyectos/pruebas-modeling/Person/MDL/Customer.py", line 5, in ? from Person.Person import Person ImportError: No module named Person It looks like the problem arises when using Inheritance. In my model, the Customer entity inherits from the Person entity. The python code generated by modeling tryies to import Person when defining Customer and it can't find it. I think a possible solution would be to modify the __init__.py file of the package modeling is generating so it imports all the domain classes generated. Here is my pymodel and test file: from Modeling.PyModel import * Attribute.defaults['usedForLocking']=1 AString.defaults['externalType']='TEXT' AString.defaults['width'] = 0 AString.defaults['usedForLocking']=1 Association.defaults['delete']=['nullify', 'nullify'] Entity.defaults['properties'] = [ APrimaryKey('id', isClassProperty=0, isRequired=1, doc='PK') ] _connDict = {'database': 'people.sqlite'} model = Model('Person', adaptorName='SQLite', connDict=_connDict, version='0.1') model.entities = [ Entity('Person', properties = [AString('name'), AString('surname')], ), Entity('Customer', properties = [AString('phone')], parent='Person', ) ] model.build() if __name__ == '__main__': from Modeling.EditingContext import EditingContext from Person.Person import Person from Person.Customer import Customer ec = EditingContext() p = Person() p.setName('Erny') ec.insert(p) c = Customer() c.setName('Lorenzo') c.setPhone('93923924') |
From: Joeh L. M. C. L. <joe...@jo...> - 2004-08-15 12:02:49
|
<!-- This plain text message area is for recipients who have email programs that= do not support html emails (almost every modern email client software progra= m can accept html emails). If you want to add an alternate plain text messag= e for those who cannot receive html emails, enter it here. //--> <META HTTP-EQUIV=3D"Content-Type" CONTENT=3D"text/html;charset=3Diso-8859-1"= > <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML><HEAD> <META http-equiv=3DContent-Type content=3D"text/html; charset=3Diso-8859-1"> <META content=3D"MSHTML 6.00.2800.1458" name=3DGENERATOR> <STYLE></STYLE> </HEAD> <BODY> <P class=3DMsoNormal style=3D"MARGIN: 0in 0in 0pt; TEXT-ALIGN: center"=20 align=3Dcenter><FONT face=3DArial><FONT color=3D#000080 size=3D6>Joeh=20 Lace</FONT></FONT></P> <P class=3DMsoNormal style=3D"MARGIN: 0in 0in 0pt; TEXT-ALIGN: center"=20 align=3Dcenter><FONT face=3DArial><FONT color=3D#000080 size=3D4>MODELS=20 WANTED</FONT></FONT></P> <P class=3DMsoNormal style=3D"MARGIN: 0in 0in 0pt; TEXT-ALIGN: center"=20 align=3Dcenter><FONT face=3DArial><FONT color=3D#000080 size=3D4>CALL=20 TODAY</FONT></FONT></P> <P class=3DMsoNormal style=3D"MARGIN: 0in 0in 0pt; TEXT-ALIGN: center"=20 align=3Dcenter><FONT face=3DArial><FONT color=3D#000080 size=3D4>(IF NO ANS= WER, LEAVE=20 VOICE MESSAGE)</FONT></FONT></P> <P class=3DMsoNormal style=3D"MARGIN: 0in 0in 0pt; TEXT-ALIGN: center"=20 align=3Dcenter><FONT face=3DArial><FONT color=3D#000080><FONT size=3D4>EMAI= L: </FONT><A=20 href=3D"mailto:joe...@co..."><FONT=20 size=3D4>joe...@co...</FONT></A></FONT></FONT></P> <P class=3DMsoNormal style=3D"MARGIN: 0in 0in 0pt; TEXT-ALIGN: center"=20 align=3Dcenter><FONT face=3DArial><FONT color=3D#000080><FONT size=3D4>Webs= ite:=20 </FONT><A href=3D"http://www.joehlace.com"><FONT=20 size=3D4>www.joehlace.com</FONT></A><BR><FONT size=3D4>See a 2.50 min Strea= ming=20 Video: <BR><A href=3D"http://joehlace.com/jl_vdemo1__wmv.html">Click Here:=20 Joehlace</A><BR>(No need for download)<BR>Individuals who are pursuing care= ers=20 in modeling, acting or dance are welcome to post their talents with =93Joeh= Lace=20 Modeling Concepts =94. =93Joeh Lace Concepts=94 want to open doors for thos= e talented=20 members that are willing to pursue their goals. We offer many benefits.&nbs= p;=20 Such as, booking models for grand openings of new stores, restaurants, smal= l to=20 mid-size businesses, corporations, hosting our members on websites, publish= ing=20 members for the Joeh Lace Calendar, and contracting our clients for video=20 events.</FONT></FONT></FONT></P><SPAN=20 style=3D"FONT-SIZE: 20pt; COLOR: blue; FONT-FAMILY: 'Times New Roman'; mso-= bidi-font-size: 10.0pt; mso-fareast-font-family: 'Times New Roman'; mso-ansi= -language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"> <P class=3DMsoBodyText style=3D"MARGIN: 0in -9pt 0pt 31.5pt" align=3Dleft><F= ONT=20 face=3DArial size=3D4>.</FONT></P></SPAN></BODY></HTML> |
From: Lorenzo G. S. <lg...@si...> - 2004-08-13 08:20:13
|
> Anyhow, thanks for reporting! may I ask you to fill a bug report? I'll get > back to you next week (I can't say exactly when, I'll be extremely busy for the > 10 coming days). > I will fill the bug (since it also happened to me) Regards Lorenzo Gil |