def writeProtocolToDatabase(protocol, idprotocol=None):
    """
    Пишет протокол в базу данных
    @protocol - объект протокола
    @idprotocol - если задано, то пишет на этот айди. Если таковой айди имеется в базе данных, то проиcходит перезапись.
    """
    db=dbdesc()
    cursor=db.cursor()
    pickled=pickle.dumps(protocol)

    if (idprotocol==None):
        #вкатываем протокол в базу данных через pickle
        sql = """INSERT INTO protocols(ProductName, TestName, Pickle)
            VALUES (%(model)s, %(testname)s ,  %(pickl)s)
            """
        #print (sql)
    # исполняем SQL-запрос
        try:
            cursor.execute(sql,  {'model':protocol.model, 'testname':protocol.typeOfTest, 'pickl': pickled})
            #cursor.execute(sql,  {'model':"проверка", 'testname':protocol.typeOfTest, 'pickl': pickled})
            db.commit()
        except:
            # Rollback in case there is any error
            db.rollback()
            db.close()
            return 1

    else:   #если  айди задан
        #то сперва надо удалить такой айди в базе, если он, правда, есть. Если такого нет, то надо выкинуть ошибку наверное (?)

        sql = "DELETE FROM protocols WHERE ID='"+str(idprotocol)+"'"
        try:
            cursor.execute(sql)
            db.commit()
        except:
            db.rollback()
            db.close()
            return 1  #ключевой момент - если не найдено такого айди, то вернуть один и ничего не делать



        #вкатываем протокол в базу данных через pickle
        sql = """INSERT INTO protocols(ID, ProductName, TestName, Pickle)
            VALUES (%(ID)s,  %(model)s, %(testname)s ,  %(pickl)s)
            """
        #print (sql)
    # исполняем SQL-запрос
        try:
            cursor.execute(sql,  {'ID':idprotocol,'model':protocol.model, 'testname':protocol.typeOfTest, 'pickl': pickled})
            db.commit()
        except:
            # Rollback in case there is any error
            db.rollback()
            db.close()
            return 1


    # disconnect from server
    db.close()
    return 0
def get_list_of_protocols(filters=None):
    """
    возвращает список протоколов, получаемых из базы данных,
    или же словарь, где id в базе данных - объект
    filters - строка с фильтрами. Может быть None
    """
    db = dbdesc()
    cursor = db.cursor()

    if filters == None:
        sql = "Select * from protocols;"

    else:
        sql = "Select * from protocols where {0} ;".format(filters)

    cursor.execute(sql)  # может вытряжнуть какое-нибудь исключение

    ## Dump the results to a string
    rows = cursor.fetchall()

    ## Get the results
    res = dict()
    for each in rows:
        ## The result is also in a tuple
        res[each[0]] = pickle.loads(each[3])
    return res
def getProtocolFromDatabase (id):
    """
    Получить протокол из базы данных
    @id: айди в базе данных
    """
    db=dbdesc()
    cursor = db.cursor()
    sql= "Select * from protocols where id = {0} ;".format(id)
    cursor.execute (sql)  #может вытряжнуть какое-нибудь исключение

    ## Dump the results to a string
    rows = cursor.fetchall()

    if (len(rows)==0):  #если такого нет
        return None, "Error, no such protocol in database"

    ## Get the results
    result=rows[0]
    return pickle.loads(rows[0][3]), rows[0][1], rows[0][2]
def getResultFromDatabase(id):

    """
    Получить результат из базы данных
    @id: айди в базе данных
    """
    db=dbdesc()
    cursor = db.cursor()
    sql= "Select * from results where id = {0} ;".format(id)
    cursor.execute (sql)  #может вытряжнуть какое-нибудь исключение

    ## Dump the results to a string
    rows = cursor.fetchall()

    if (len(rows)==0):  #если такого нет
        return None, "Ошибка, нет такого результата в базе данных"

    ## Get the results
    result=rows[0]
    return pickle.loads(rows[0][8]), rows[0][1], rows[0][2], rows[0][3], rows[0][4], rows[0][5], rows[0][6], rows[0][7], rows[0][11], rows[0][12]
def getProtocolFromDatabaseParams (ProductName, TestName):
    """
    Получить протокол из базы данных
    @ProductName - имя продукта
    @TestName - имя теста
    """
    db=dbdesc()
    cursor = db.cursor()
    sql= "Select * from protocols where ProductName = '{0}' and TestName = '{1}';".format(ProductName, TestName)


    cursor.execute (sql)  #может вытряжнуть какое-нибудь исключение

    ## Dump the results to a string
    rows = cursor.fetchall()

    if (len(rows)==0):  #если такого нет
        return None, "Error, no such protocol in database"

    ## Get the results
    result=rows[0]
    return pickle.loads(rows[0][3]), rows[0][1], rows[0][2]
def  writeResultToDatabase(result, idresult=None):
    """
    Записать результат в базу данных
    @result - объект результата
    @idresult - если задано, то пишет на этот айди. Если таковой айди имеется в базе данных, то проиcходит обязательная перезапись

    """

    if result==None:
        return 1

    db=dbdesc()
    cursor=db.cursor()
    pickled=pickle.dumps(result)

#
# `ID` int(11) NOT NULL AUTO_INCREMENT,
#   `ProductName` text,
#   `TestName` text,
#   `Operator` text,
#   `Date` datetime DEFAULT NULL,
#   `SerialNumber` text,
#   `BatchNumber` text,
#   `TypeOfTest` text,
#   `Pickle` blob,
#   `XML` text,
#   `Text` text,
#   `resultscol` varchar(45) DEFAULT NULL,


 #
    #          model=str()
    # typeOfTest=str()
    # operator=str()
    # testDateTime=str()
    # testTime=str()
    # numOfProduct=int()
    # numOfBatch=int()
    # hasPassedTest=bool() #1 - прошёл, 0 - не прошйл. Результаты испытаний
    # proceduresResults=dict() #номер испытания - resultsOfProcedure


    if (idresult==None):
        #вкатываем протокол в базу данных через pickle
        sql = """INSERT INTO results(ProductName, TestName, Operator, Date, SerialNumber, BatchNumber, Pickle, hasPassedTest)
            VALUES (%(model)s, %(testname)s ,  %(Operator)s, %(Date)s, %(SerialNumber)s, %(BatchNumber)s, %(pickl)s, %(hasPassedTest)s  )
            """
        #print (sql)
    # исполняем SQL-запрос
        try:

            cursor.execute(sql,  {'model':result.model, 'testname':result.typeOfTest,   'Operator':result.operator,
                                  'Date':result.testDateTime, 'SerialNumber':result.numOfProduct, 'BatchNumber':result.numOfBatch,
                                  'pickl':pickled, 'hasPassedTest':result.hasPassedTest})
            db.commit()
        except:
            # Rollback in case there is any error
            db.rollback()
            db.close()
            return 2


    else:   #если  айди задан
        #то сперва надо удалить такой айди в базе, если он, правда, есть. Если такого нет, то надо выкинуть ошибку наверное (?)

        sql = "DELETE FROM results WHERE ID='"+str(idresult)+"'"
        try:
            cursor.execute(sql)
            db.commit()
        except:
            db.rollback()
            db.close()
            return 3  #ключевой момент - если не найдено такого айди, то вернуть один и ничего не делать


        #вкатываем протокол в базу данных через pickle
        sql = """INSERT INTO results(ID, ProductName, TestName, Operator, Date, SerialNumber, BatchNumber, Pickle, hasPassedTest)
            VALUES (%(ID)s,  %(model)s, %(testname)s ,  %(Operator)s, %(Date)s, %(SerialNumber)s, %(BatchNumber)s, %(pickl)s, %(hasPassedTest)s  )
            """


        #print (sql)
    # исполняем SQL-запрос
        #try:
        cursor.execute(sql,  {'ID':str(idresult), 'model':result.model, 'testname':result.typeOfTest,   'Operator':result.operator,
                                  'Date':result.testDateTime, 'SerialNumber':result.numOfProduct, 'BatchNumber':result.numOfBatch,
                                  'pickl':pickled, 'hasPassedTest':result.hasPassedTest})

        db.commit()
        #except:
            # Rollback in case there is any error
        #    db.rollback()
        #    db.close()
        #    return 4

    # disconnect from server
    db.close()
    return 0