I didn't have much luck with switching to a datetimeproperty using
milliseconds eithers. I also tried handling the value changing in the
check method directly, since it looked like it was possible there.
Same results, the datastore gets corrupted. The error I get when I try
to start the datastore after stopping it is.

<class 'struct.error'>: unpack requires a string argument of length 8

def checkScoreValue(self, value):
  valid = False
  while valid == False:
    query = db.GqlQuery('SELECT * FROM Story WHERE score = :1', value)
    results = query.fetch(1)
    if len(results) > 0:
      value = value + 0.001
    else:
      valid = True
  return value



I've filed an issue, #922 - 
http://code.google.com/p/googleappengine/issues/detail?id=922


On Dec 13, 10:01 am, "bowman.jos...@gmail.com"
<bowman.jos...@gmail.com> wrote:
> I'm trying to make sure a score field I set for articles on my site in
> unique, however, I'm running into an issue where my method is
> appearing to corrupt my datastore. After I input stories, I can't view
> pages, getting a return size too large error, and when I stop and
> start the SDK, it won't restart.
>
> Here's what I'm doing.
>
> I set up a new Score Property.
> ------------------------------------------------------------------------------------
> class ScoreProperty(db.FloatProperty):
>
> def checkScoreValue(self, value):
>   query = db.GqlQuery('SELECT * FROM Story WHERE score = :1', value)
>   results = query.fetch(1)
>   if len(results) > 0:
>     raise db.BadValueError(
>         'Property %s must be unique' % self.name)
>   return value
>
> def __init__(self, verbose_name=None, name=None):
>   super(ScoreProperty, self).__init__(
>     verbose_name, name, required=False,
>     validator=self.checkScoreValue)
> ------------------------------------------------------------------------------------
>
> Then when I go to add a story, I use this try statement
> ------------------------------------------------------------------------------------
> story_added = False
> while story_added == False:
> try:
>   story.put()
>   story_added = True
> except db.BadValueError:
>   story.score = story.score + 0.001
> ------------------------------------------------------------------------------------
>
> What should happen is that when a put is attempted, a check is done to
> see if a story with that score exists. If it does exist, add 0.001 and
> try to put again. After adding several stories in batch mode, I can
> using the data view that appears to be working, but strangely. I'll
> see a score of ###.0 and then the next would be something like ###.
> 043, so I'm not sure what happened to .001-.0042. Also, after running
> the process the datastore appears to be corrupted as well.
>
> I'm considering swapping to using a DateTimeProperty and keying off of
> the miliseconds to see if that is handled better, but I'm confused as
> to why this current method is creating problems.
>
> One thing that might be an issue is the development is happening on an
> eeepc, which is a single core processor and it's SSD isn't the fast
> read/write storage device.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google App Engine" group.
To post to this group, send email to google-appengine@googlegroups.com
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to