diff --git a/tko/db.py b/tko/db.py
index 362feae..a70774d 100644
--- a/tko/db.py
+++ b/tko/db.py
@@ -13,10 +13,13 @@
 
 
 class MySQLTooManyRows(Exception):
+    """Too many records."""
     pass
 
 
 class db_sql(object):
+    """Data access."""
+
     def __init__(self, debug=False, autocommit=True, host=None,
                  database=None, user=None, password=None):
         self.debug = debug
@@ -129,7 +132,12 @@
 
         It can be safely used with transactions, but the
         transaction start & end must be completely contained
-        within the call to 'function'."""
+        within the call to 'function'.
+
+        @param function: The function to run with retry.
+        @param args: The arguments
+        @param dargs: The named arguments.
+        """
         OperationalError = _get_error_class("OperationalError")
 
         success = False
@@ -163,6 +171,10 @@
 
 
     def dprint(self, value):
+        """Print out debug value.
+
+        @param value: The value to print out.
+        """
         if self.debug:
             sys.stdout.write('SQL: ' + str(value) + '\n')
 
@@ -174,6 +186,7 @@
 
 
     def commit(self):
+        """Commit the sql transaction."""
         if self.autocommit:
             return self.run_with_retry(self._commit)
         else:
@@ -181,10 +194,15 @@
 
 
     def rollback(self):
+        """Rollback the sql transaction."""
         self.con.rollback()
 
 
     def get_last_autonumber_value(self):
+        """Gets the last auto number.
+
+        @return: The last auto number.
+        """
         self.cur.execute('SELECT LAST_INSERT_ID()', [])
         return self.cur.fetchall()[0][0]
 
@@ -240,6 +258,13 @@
                   where = ("a = %s AND b = %s", ['val', 'val'])
                 is better than
                   where = "a = 'val' AND b = 'val'"
+
+        @param fields: The list of selected fields string.
+        @param table: The name of the database table.
+        @param where: The where clause string.
+        @param distinct: If select distinct values.
+        @param group_by: Group by clause.
+        @param max_rows: unused.
         """
         cmd = ['select']
         if distinct:
@@ -256,6 +281,7 @@
 
         # create a re-runable function for executing the query
         def exec_sql():
+            """Exeuctes an the sql command."""
             sql = ' '.join(cmd)
             numRec = self.cur.execute(sql, values)
             if max_rows is not None and numRec > max_rows:
@@ -273,29 +299,34 @@
     def select_sql(self, fields, table, sql, values):
         """\
                 select fields from table "sql"
+
+        @param fields: The list of selected fields string.
+        @param table: The name of the database table.
+        @param sql: The sql string.
+        @param values: The sql string parameter values.
         """
         cmd = 'select %s from %s %s' % (fields, table, sql)
         self.dprint(cmd)
 
         # create a -re-runable function for executing the query
-        def exec_sql():
+        def _exec_sql():
             self.cur.execute(cmd, values)
             return self.cur.fetchall()
 
         # run the query, re-trying after operational errors
         if self.autocommit:
-            return self.run_with_retry(exec_sql)
+            return self.run_with_retry(_exec_sql)
         else:
-            return exec_sql()
+            return _exec_sql()
 
 
     def _exec_sql_with_commit(self, sql, values, commit):
         if self.autocommit:
             # re-run the query until it succeeds
-            def exec_sql():
+            def _exec_sql():
                 self.cur.execute(sql, values)
                 self.con.commit()
-            self.run_with_retry(exec_sql)
+            self.run_with_retry(_exec_sql)
         else:
             # take one shot at running the query
             self.cur.execute(sql, values)
@@ -309,6 +340,10 @@
 
                 data:
                         dictionary of fields and data
+
+        @param table: The name of the table.
+        @param data: The insert data.
+        @param commit: If commit the transaction .
         """
         fields = data.keys()
         refs = ['%s' for field in fields]
@@ -322,6 +357,12 @@
 
 
     def delete(self, table, where, commit = None):
+        """Delete entries.
+
+        @param table: The name of the table.
+        @param where: The where clause.
+        @param commit: If commit the transaction .
+        """
         cmd = ['delete from', table]
         if commit is None:
             commit = self.autocommit
@@ -339,6 +380,11 @@
 
                 data:
                         dictionary of fields and data
+
+        @param table: The name of the table.
+        @param data: The sql parameter values.
+        @param where: The where clause.
+        @param commit: If commit the transaction .
         """
         if commit is None:
             commit = self.autocommit
@@ -358,6 +404,11 @@
 
 
     def delete_job(self, tag, commit = None):
+        """Delete a tko job.
+
+        @param tag: The job tag.
+        @param commit: If commit the transaction .
+        """
         job_idx = self.find_job(tag)
         for test_idx in self.find_tests(job_idx):
             where = {'test_idx' : test_idx}
@@ -372,6 +423,13 @@
 
 
     def insert_job(self, tag, job, parent_job_id=None, commit=None):
+        """Insert a tko job.
+
+        @param tag: The job tag.
+        @param job: The job object.
+        @param parent_job_id: The parent job id.
+        @param commit: If commit the transaction .
+        """
         job.machine_idx = self.lookup_machine(job.machine)
         if not job.machine_idx:
             job.machine_idx = self.insert_machine(job, commit=commit)
@@ -391,13 +449,19 @@
                 'finished_time': job.finished_time,
                 'afe_job_id': afe_job_id,
                 'afe_parent_job_id': parent_job_id}
+        job.afe_job_id = afe_job_id
+        if parent_job_id:
+            job.afe_parent_job_id = str(parent_job_id)
         if job.label:
             label_info = site_utils.parse_job_name(job.label)
             if label_info:
                 data['build'] = label_info.get('build', None)
-                data['build_version'] = label_info.get('build_version', None)
-                data['board'] = label_info.get('board', None)
-                data['suite'] = label_info.get('suite', None)
+                job.build_version = data['build_version'] = label_info.get(
+                        'build_version', None)
+                job.board = data['board'] = label_info.get('board', None)
+                job.suite = data['suite'] = label_info.get('suite', None)
+
+        # TODO(ntang): check job.index directly.
         is_update = hasattr(job, 'index')
         if is_update:
             self.update('tko_jobs', data, {'job_idx': job.index}, commit=commit)
@@ -410,6 +474,11 @@
 
 
     def update_job_keyvals(self, job, commit=None):
+        """Updates the job key values.
+
+        @param job: The job object.
+        @param commit: If commit the transaction .
+        """
         for key, value in job.keyval_dict.iteritems():
             where = {'job_id': job.index, 'key': key}
             data = dict(where, value=value)
@@ -422,6 +491,12 @@
 
 
     def insert_test(self, job, test, commit = None):
+        """Inserts a job test.
+
+        @param job: The job object.
+        @param test: The test object.
+        @param commit: If commit the transaction .
+        """
         kver = self.insert_kernel(test.kernel, commit=commit)
         data = {'job_idx':job.index, 'test':test.testname,
                 'subdir':test.subdir, 'kernel_idx':kver,
@@ -472,6 +547,7 @@
 
 
     def read_machine_map(self):
+        """Reads the machine map."""
         if self.machine_group or not self.machine_map:
             return
         for line in open(self.machine_map, 'r').readlines():
@@ -480,6 +556,12 @@
 
 
     def machine_info_dict(self, job):
+        """Reads the machine information of a job.
+
+        @param job: The job object.
+
+        @return: The machine info dictionary.
+        """
         hostname = job.machine
         group = job.machine_group
         owner = job.machine_owner
@@ -494,12 +576,22 @@
 
 
     def insert_machine(self, job, commit = None):
+        """Inserts the job machine.
+
+        @param job: The job object.
+        @param commit: If commit the transaction .
+        """
         machine_info = self.machine_info_dict(job)
         self.insert('tko_machines', machine_info, commit=commit)
         return self.get_last_autonumber_value()
 
 
     def update_machine_information(self, job, commit = None):
+        """Updates the job machine information.
+
+        @param job: The job object.
+        @param commit: If commit the transaction .
+        """
         machine_info = self.machine_info_dict(job)
         self.update('tko_machines', machine_info,
                     where={'hostname': machine_info['hostname']},
@@ -507,6 +599,10 @@
 
 
     def lookup_machine(self, hostname):
+        """Look up the machine information.
+
+        @param hostname: The hostname as string.
+        """
         where = { 'hostname' : hostname }
         rows = self.select('machine_idx', 'tko_machines', where)
         if rows:
@@ -516,6 +612,10 @@
 
 
     def lookup_kernel(self, kernel):
+        """Look up the kernel.
+
+        @param kernel: The kernel object.
+        """
         rows = self.select('kernel_idx', 'tko_kernels',
                                 {'kernel_hash':kernel.kernel_hash})
         if rows:
@@ -525,6 +625,11 @@
 
 
     def insert_kernel(self, kernel, commit = None):
+        """Insert a kernel.
+
+        @param kernel: The kernel object.
+        @param commit: If commit the transaction .
+        """
         kver = self.lookup_kernel(kernel)
         if kver:
             return kver
@@ -558,6 +663,12 @@
 
 
     def insert_patch(self, kver, patch, commit = None):
+        """Insert a kernel patch.
+
+        @param kver: The kernel version.
+        @param patch: The kernel patch object.
+        @param commit: If commit the transaction .
+        """
         print patch.reference
         name = os.path.basename(patch.reference)[:80]
         self.insert('tko_patches',
@@ -569,6 +680,12 @@
 
 
     def find_test(self, job_idx, testname, subdir):
+        """Find a test by name.
+
+        @param job_idx: The job index.
+        @param testname: The test name.
+        @param subdir: The test sub directory under the job directory.
+        """
         where = {'job_idx': job_idx , 'test': testname, 'subdir': subdir}
         rows = self.select('test_idx', 'tko_tests', where)
         if rows:
@@ -578,6 +695,11 @@
 
 
     def find_tests(self, job_idx):
+        """Find all tests by job index.
+
+        @param job_idx: The job index.
+        @return: A list of tests.
+        """
         where = { 'job_idx':job_idx }
         rows = self.select('test_idx', 'tko_tests', where)
         if rows:
@@ -587,6 +709,11 @@
 
 
     def find_job(self, tag):
+        """Find a job by tag.
+
+        @param tag: The job tag name.
+        @return: The job object or None.
+        """
         rows = self.select('job_idx', 'tko_jobs', {'tag': tag})
         if rows:
             return rows[0][0]
@@ -612,7 +739,13 @@
 def db(*args, **dargs):
     """Creates an instance of the database class with the arguments
     provided in args and dargs, using the database type specified by
-    the global configuration (defaulting to mysql)."""
+    the global configuration (defaulting to mysql).
+
+    @param args: The db_type arguments.
+    @param dargs: The db_type named arguments.
+
+    @return: An db object.
+    """
     db_type = _get_db_type()
     db_module = __import__("autotest_lib.tko." + db_type, globals(),
                            locals(), [db_type])
