Thank you again Niphlod. That seems like a sensible way for me to separate 
the two out. I'll give that a try.

On Friday, 9 November 2012 10:31:04 UTC-5, Niphlod wrote:
>
> if you can, use a separate db for the scheduler. SQLite doesn't handle 
> well concurrent writes (with default operational capabilities), so having 
> the scheduler operating on the same database of your "insertion" of 
> messages can lead to locks.
>
> Just do 
>
> db = DAL('whatever.db')
> db2 = DAL('whatever_scheduler.db')
>
> db.define_table('messages', .....)
>
> from gluon.scheduler import Scheduler
> mysched = Scheduler(db2)
>
> and to queue tasks you can then use
>
> db2.scheduler_tasks.validate_and_insert(****)
>
> or, with the new API
>
> mysched.queue_task(***)
>
>
>
> On Friday, November 9, 2012 3:56:59 PM UTC+1, Mike Anson wrote:
>>
>> Greetings...
>>
>> I may have a problem with my database (sqlite) locking.
>>
>> Traceback (most recent call last):
>>   File "/home/web2py/src/web2py/gluon/scheduler.py", line 218, in executor
>>     result = dumps(_function(*args,**vars))
>>   File "applications/ircmessage/models/tasks.py", line 57, in 
>> send_unsent_messages
>>     for row in db(db.messages.status=='unsent').select(db.messages.id, 
>> db.messages.message, db.messages.uid):
>>   File "/home/web2py/src/web2py/gluon/dal.py", line 8787, in select
>>     return adapter.select(self.query,fields,attributes)
>>   File "/home/web2py/src/web2py/gluon/dal.py", line 2127, in select
>>     return super(SQLiteAdapter, self).select(query, fields, attributes)
>>   File "/home/web2py/src/web2py/gluon/dal.py", line 1615, in select
>>     return self._select_aux(sql,fields,attributes)
>>   File "/home/web2py/src/web2py/gluon/dal.py", line 1580, in _select_aux
>>     self.execute(sql)
>>   File "/home/web2py/src/web2py/gluon/dal.py", line 1693, in execute
>>     return self.log_execute(*a, **b)
>>   File "/home/web2py/src/web2py/gluon/dal.py", line 1687, in log_execute
>>     ret = self.cursor.execute(*a, **b)
>> OperationalError: database is locked
>>
>> I have a scheduler every minute that get's records (messages) out of the 
>> DB with a status of unsent. The messages then get posted to an IRC channel 
>> and updated to sent to they are not included the next time the scheduler 
>> runs the script.
>>
>> This seems to work just fine.
>>
>> It's when I inject a new message (which by default has a message status 
>> set to unsent) via a bash script. The message inserts fine but my script 
>> that posts it to the IRC channel doesn't not post anything but simply 
>> updates it's status to sent without actually sending it. By sending it I 
>> mean post a message over sockets.
>>
>> Here is my model for sending unsent messages:
>>         for row in db(db.messages.status=='unsent').select(db.messages.id, 
>> db.messages.message, db.messages.uid):
>>             message_id = row.id
>>             message_message = row.message
>>             message_uid = row.uid
>>             
>>             #socket connection already opened earlier in the script
>>             s.send("PRIVMSG %s :%s - %s\r\n" % (channel, message_uid, 
>> message_message))
>>             print "message %s has been sent" % message_id
>>
>>             ## Only seems to print message when a delay is here.
>>             time.sleep(5)
>>
>>             ## Set message record to sent and update modified field
>>             modified_stamp = strftime("%Y-%m-%d %H:%M:%S")
>>             db.messages[message_id] = dict(status='sent', 
>> modified=modified_stamp)
>>         
>>             db.commit()
>>
>> Inserting a message via jsonrpc (shown) and cURL (not shown):
>>
>> @service.jsonrpc
>> def savemessage(message, uid):
>>     db.messages.insert(message=message, uid=uid)
>>     db.commit()
>>     
>>     message = {"status":"saved"}
>>
>>     return message
>>
>>
>> Should I simply switch to a postgresql or mysql database to prevent this 
>> locking?
>>
>> Thanks for any help/advice in advance
>>
>

-- 



Reply via email to