## @file
# This file is used to create/update/query/erase table for functions
#
# Copyright (c) 2008, Intel Corporation
# All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution.  The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#

##
# Import Modules
#
import Common.EdkLogger as EdkLogger
from Table import Table
from Common.String import ConvertToSqlString

## TableFunction
#
# This class defined a table used for function
# 
# @param Table:       Inherited from Table class
#
class TableFunction(Table):
    def __init__(self, Cursor):
        Table.__init__(self, Cursor)
        self.Table = 'Function'
    
    ## Create table
    #
    # Create table Function
    #
    # @param ID:                  ID of a Function
    # @param Header:              Header of a Function
    # @param Modifier:            Modifier of a Function 
    # @param Name:                Name of a Function
    # @param ReturnStatement:     ReturnStatement of a Funciont
    # @param StartLine:           StartLine of a Function
    # @param StartColumn:         StartColumn of a Function
    # @param EndLine:             EndLine of a Function
    # @param EndColumn:           EndColumn of a Function
    # @param BodyStartLine:       StartLine of a Function body
    # @param BodyStartColumn:     StartColumn of a Function body
    # @param BelongsToFile:       The Function belongs to which file
    # @param FunNameStartLine:    StartLine of a Function name
    # @param FunNameStartColumn:  StartColumn of a Function name
    #
    def Create(self):
        SqlCommand = """create table IF NOT EXISTS %s (ID INTEGER PRIMARY KEY,
                                                       Header TEXT,
                                                       Modifier VARCHAR,
                                                       Name VARCHAR NOT NULL,
                                                       ReturnStatement VARCHAR,
                                                       StartLine INTEGER NOT NULL,
                                                       StartColumn INTEGER NOT NULL,
                                                       EndLine INTEGER NOT NULL,
                                                       EndColumn INTEGER NOT NULL,
                                                       BodyStartLine INTEGER NOT NULL,
                                                       BodyStartColumn INTEGER NOT NULL,
                                                       BelongsToFile SINGLE NOT NULL,
                                                       FunNameStartLine INTEGER NOT NULL,
                                                       FunNameStartColumn INTEGER NOT NULL
                                                      )""" % self.Table
        Table.Create(self, SqlCommand)

    ## Insert table
    #
    # Insert a record into table Function
    #
    # @param ID:                  ID of a Function
    # @param Header:              Header of a Function
    # @param Modifier:            Modifier of a Function 
    # @param Name:                Name of a Function
    # @param ReturnStatement:     ReturnStatement of a Funciont
    # @param StartLine:           StartLine of a Function
    # @param StartColumn:         StartColumn of a Function
    # @param EndLine:             EndLine of a Function
    # @param EndColumn:           EndColumn of a Function
    # @param BodyStartLine:       StartLine of a Function body
    # @param BodyStartColumn:     StartColumn of a Function body
    # @param BelongsToFile:       The Function belongs to which file
    # @param FunNameStartLine:    StartLine of a Function name
    # @param FunNameStartColumn:  StartColumn of a Function name
    #
    def Insert(self, Header, Modifier, Name, ReturnStatement, StartLine, StartColumn, EndLine, EndColumn, BodyStartLine, BodyStartColumn, BelongsToFile, FunNameStartLine, FunNameStartColumn):
        self.ID = self.ID + 1
        (Header, Modifier, Name, ReturnStatement) = ConvertToSqlString((Header, Modifier, Name, ReturnStatement))
        SqlCommand = """insert into %s values(%s, '%s', '%s', '%s', '%s', %s, %s, %s, %s, %s, %s, %s, %s, %s)""" \
                                    % (self.Table, self.ID, Header, Modifier, Name, ReturnStatement, StartLine, StartColumn, EndLine, EndColumn, BodyStartLine, BodyStartColumn, BelongsToFile, FunNameStartLine, FunNameStartColumn)
        Table.Insert(self, SqlCommand)

        return self.ID
