## @file
# This file is used to create/update/query/erase table for Queries
#
# 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 Common.String import ConvertToSqlString
from Table import Table

## TableQuery
#
# This class defined a table used for Query
# 
# @param object:       Inherited from object class
#
#
class TableQuery(Table):
    def __init__(self, Cursor):
        Table.__init__(self, Cursor)
        self.Table = 'Query'
    
    ## Create table
    #
    # Create table Query
    #
    # @param ID:                 ID of a Query
    # @param Name:               Modifier of a Query
    # @param Value:              Type of a Query
    # @param Model:              Model of a Query
    #
    def Create(self):
        SqlCommand = """create table IF NOT EXISTS %s(ID INTEGER PRIMARY KEY,
                                                      Name TEXT DEFAULT '',
                                                      Value TEXT DEFAULT '',
                                                      Model INTEGER DEFAULT 0
                                                     )""" % self.Table
        Table.Create(self, SqlCommand)

    ## Insert table
    #
    # Insert a record into table Query
    #
    # @param ID:                 ID of a Query
    # @param Name:               Modifier of a Query
    # @param Value:              Type of a Query
    # @param Model:              Model of a Query
    #
    def Insert(self, Name, Value, Model):
        self.ID = self.ID + 1
        SqlCommand = """insert into %s values(%s, '%s', '%s', %s)""" \
                                           % (self.Table, self.ID, Name, Value, Model)
        Table.Insert(self, SqlCommand)

        return self.ID
    