Currently I am new to programming and I thought Python and web2py would be 
a good way to learn. But, I am in it over my head when it comes to this 
problem. I'm getting an error when trying to access a db connection inside 
a Thread which is contained inside a module. The most pertinent part of the 
error is this. "if not self.connection: raise ValueError(a[0])" Here are 
the related pieces of code which are causing the problem. I've tried 
setting the value of db using a method inside coffee_server_threadR6. I 
have tried every way I can think of to get db into the module.(including 
current) and unfortunately once the tread is initialized I can't retrieve 
or set any data from my database. The only thing that does work is seeing 
which tables, and columns exist. So, it's as though once the variable db 
gets placed into the thread it no longer has a connection to the database 
at all. Any thoughts on this are appreciated.

Models - db.py

db = DAL('sqlite://storage.sqlite',pool_size=2,check_reserved=['all'],
do_connect=True)

Controllers - default

@auth.requires_login()
def startserv():
    Server.ThreadedTCPRequestHandler.db = db
    reactor = Server.Reactor()
    reactor.daemon = True
    reactor.start()
    return redirect(URL('index'))

Modules - coffee_server_threadR6.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from gluon import *
from gluon import current
import threading
import time
import SocketServer
import struct
import binascii
from subprocess import Popen
import databaseTest as Db_Conn


SEND_WAKEUP = chr(1)
AM_AWAKE = chr(0)

class ThreadedTCPRequestHandler(SocketServer.StreamRequestHandler):

    cur_thread = threading.current_thread()
    db = None

    def wakeup_computer(self,mac):
        Popen(['echo', str(mac)])
        time.sleep(3)
        Popen(['echo', str(mac)])

    def handle(self):
        recv_data = self.request.recv(1024)
        packed_data = binascii.unhexlify(recv_data)
        s = struct.Struct('c 17s')
        self.unpacked_data = s.unpack(packed_data)
        self.macAddr = str(self.unpacked_data[1])
        self.command = self.unpacked_data[0]
        response = "{}: {}".format(self.cur_thread.name, self.macAddr)
        self.request.sendall(response)
        self.updateDB(self.macAddr)

    def updateDB(self,mac):
        print self.db.computerstats.fields
        print self.db.computerstats.mac_addr.type
        print type(mac)
        comp = self.db(self.db.computerstats.id=="1").select().first()
        print comp
        self.db(self.db.computerstats.mac_addr==mac).update(status=1)
        self.db.commit()
        
#self.db(self.db.computerstats.mac_addr=='AA:BB:CC:DD:EE:FF').update(status=True)

class ThreadedTCPServer(SocketServer.ThreadingTCPServer):
    pass


class CountThread(threading.Thread):
    def run(self):
        global TOTAL
        for i in range(100):
            TOTAL = TOTAL + 1
        print('%s\n' % (TOTAL))

class Reactor(threading.Thread):

    def run(self):
        self.HOST, self.PORT = '', 8585
        SocketServer.TCPServer.allow_reuse_address = True
        self.server = ThreadedTCPServer((self.HOST, self.PORT), 
ThreadedTCPRequestHandler)
        print "Server is set up"
        self.server.serve_forever()

coffee_client.py - Executed from another computer. Currently testing from 
local machine.

from socket import *
import struct
import binascii


SEND_WAKEUP = chr(1)
AM_AWAKE = chr(0)

def send(data):
    sock = socket(AF_INET,SOCK_STREAM)
    sock.connect(('127.0.0.1',8585))
    try:
        sock.send(data)
        response = sock.recv(1024)
        print "Received: {}".format(response)
    finally:
        sock.close()

def wakeup(mac):
     values = (SEND_WAKEUP, mac)
     s = struct.Struct('c 17s')
     packed_data = s.pack(*values)
     hex_packed_data = binascii.hexlify(packed_data)
     send(hex_packed_data)

def am_awake(mac):
    values = (AM_AWAKE, mac)
    s = struct.Struct('c 17s')
    packed_data = s.pack(*values)
    hex_packed_data = binascii.hexlify(packed_data)
    send(hex_packed_data)
    

am_awake('AA:BB:CC:DD:EE:FF')



-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to