IMPLEMENT_TEST(SQLiteObjectDbiUnitTests, removeMsaObject) {
    U2OpStatusImpl os;
    U2MsaDbi* msaDbi = SQLiteObjectDbiTestData::getMsaDbi();

    // FIRST ALIGNMENT
    // Create an alignment
    U2DataId msaId = msaDbi->createMsaObject("", "Test name", BaseDNAAlphabetIds::NUCL_DNA_DEFAULT(), os);
    CHECK_NO_ERROR(os);

    // Add alignment info
    U2StringAttribute attr(msaId, "MSA1 info key", "MSA1 info value");
    U2AttributeDbi* attrDbi = SQLiteObjectDbiTestData::getAttributeDbi();
    attrDbi->createStringAttribute(attr, os);
    CHECK_NO_ERROR(os);

    // Create sequences
    U2SequenceDbi* sequenceDbi = SQLiteObjectDbiTestData::getSequenceDbi();
    U2Sequence seq1;
    U2Sequence seq2;
    sequenceDbi->createSequenceObject(seq1, "", os);
    CHECK_NO_ERROR(os);
    sequenceDbi->createSequenceObject(seq2, "", os);
    CHECK_NO_ERROR(os);

    // Add rows
    U2MsaRow row1;
    row1.rowId = 0;
    row1.sequenceId = seq1.id;
    row1.gstart = 0;
    row1.gend = 5;

    U2MsaGap row1gap1(0, 2);
    U2MsaGap row1gap2(3, 1);
    QList<U2MsaGap> row1gaps;
    row1gaps << row1gap1 << row1gap2;

    row1.gaps = row1gaps;

    U2MsaRow row2;
    row2.rowId = 1;
    row2.sequenceId = seq2.id;
    row2.gstart = 2;
    row2.gend = 4;

    U2MsaGap row2gap(1, 2);
    QList<U2MsaGap> row2gaps;
    row2gaps << row2gap;

    row2.gaps = row2gaps;

    QList<U2MsaRow> rows;
    rows << row1 << row2;

    msaDbi->addRows(msaId, rows, os);
    CHECK_NO_ERROR(os);

    // SECOND ALIGNMENT
    // Create an alignment
    U2DataId msaId2 = msaDbi->createMsaObject("", "Test name 2", BaseDNAAlphabetIds::AMINO_DEFAULT(), os);
    CHECK_NO_ERROR(os);

    // Add alignment info
    U2StringAttribute attr2(msaId2, "MSA2 info key", "MSA2 info value");
    attrDbi->createStringAttribute(attr2, os);
    CHECK_NO_ERROR(os);

    // Create sequences
    U2Sequence al2Seq;
    sequenceDbi->createSequenceObject(al2Seq, "", os);
    CHECK_NO_ERROR(os);

    // Add rows
    U2MsaRow al2Row;
    al2Row.rowId = 0;
    al2Row.sequenceId = al2Seq.id;
    al2Row.gstart = 0;
    al2Row.gend = 15;

    U2MsaGap al2RowGap(1, 12);
    QList<U2MsaGap> al2RowGaps;
    al2RowGaps << al2RowGap;

    al2Row.gaps = al2RowGaps;

    QList<U2MsaRow> al2Rows;
    al2Rows << al2Row;

    msaDbi->addRows(msaId2, al2Rows, os);
    CHECK_NO_ERROR(os);

    // REMOVE THE FIRST ALIGNMENT OBJECT
    SQLiteObjectDbi* sqliteObjectDbi = SQLiteObjectDbiTestData::getSQLiteObjectDbi();
    sqliteObjectDbi->removeObject(msaId, os);

    // VERIFY THAT THERE IS ONLY THE SECOND ALIGNMENT'S RECORDS LEFT IN TABLES
    SQLiteDbi* sqliteDbi = SQLiteObjectDbiTestData::getSQLiteDbi();

    // "Attribute"
    SQLiteReadQuery qAttr("SELECT COUNT(*) FROM Attribute WHERE name = ?1", sqliteDbi->getDbRef(), os);
    qAttr.bindString(1, "MSA1 info key");
    qint64 msa1AttrNum = qAttr.selectInt64();
    CHECK_EQUAL(0, msa1AttrNum, "MSA1 attributes number");

    qAttr.reset(true);
    qAttr.bindString(1, "MSA2 info key");
    qint64 msa2AttrNum = qAttr.selectInt64();
    CHECK_EQUAL(1, msa2AttrNum, "MSA2 attributes number");

    // "StringAttribute"
    SQLiteReadQuery qStringAttr("SELECT COUNT(*) FROM StringAttribute WHERE value = ?1", sqliteDbi->getDbRef(), os);
    qStringAttr.bindString(1, "MSA1 info value");
    qint64 msa1StrAttrNum = qStringAttr.selectInt64();
    CHECK_EQUAL(0, msa1StrAttrNum, "MSA1 string attributes number");

    qStringAttr.reset(true);
    qStringAttr.bindString(1, "MSA2 info value");
    qint64 msa2StrAttrNum = qStringAttr.selectInt64();
    CHECK_EQUAL(1, msa2StrAttrNum, "MSA2 string attributes number");

    // "MsaRow"
    SQLiteReadQuery qMsaRow("SELECT COUNT(*) FROM MsaRow WHERE msa = ?1", sqliteDbi->getDbRef(), os);
    qMsaRow.bindDataId(1, msaId);
    qint64 msa1Rows = qMsaRow.selectInt64();
    CHECK_EQUAL(0, msa1Rows, "number of rows in MSA1");

    qMsaRow.reset(true);
    qMsaRow.bindDataId(1, msaId2);
    qint64 msa2Rows = qMsaRow.selectInt64();
    CHECK_EQUAL(1, msa2Rows, "number of rows in MSA2");

    // "MsaRowGap"
    SQLiteReadQuery qMsaRowGap("SELECT COUNT(*) FROM MsaRowGap WHERE msa = ?1", sqliteDbi->getDbRef(), os);
    qMsaRowGap.bindDataId(1, msaId);
    qint64 msa1Gaps = qMsaRowGap.selectInt64();
    CHECK_EQUAL(0, msa1Gaps, "number of gaps in MSA1 rows");

    qMsaRowGap.reset(true);
    qMsaRowGap.bindDataId(1, msaId2);
    qint64 msa2Gaps = qMsaRowGap.selectInt64();
    CHECK_EQUAL(1, msa2Gaps, "number of gaps in MSA2 rows");

    // "Sequence"
    SQLiteReadQuery qSeq("SELECT COUNT(*) FROM Sequence WHERE object = ?1", sqliteDbi->getDbRef(), os);
    qSeq.bindDataId(1, seq1.id);
    qint64 msa1seq1 = qSeq.selectInt64();
    CHECK_EQUAL(0, msa1seq1, "seq1 of msa1");

    qSeq.reset(true);
    qSeq.bindDataId(1, seq2.id);
    qint64 msa1seq2 = qSeq.selectInt64();
    CHECK_EQUAL(0, msa1seq2, "seq2 of msa1");

    qSeq.reset(true);
    qSeq.bindDataId(1, al2Seq.id);
    qint64 msa2seq = qSeq.selectInt64();
    CHECK_EQUAL(1, msa2seq, "seq of msa2");

    // "Msa"
    SQLiteReadQuery qMsa("SELECT COUNT(*) FROM Msa WHERE object = ?1", sqliteDbi->getDbRef(), os);
    qMsa.bindDataId(1, msaId);
    qint64 msa1records = qMsa.selectInt64();
    CHECK_EQUAL(0, msa1records, "number of MSA1 records");

    qMsa.reset(true);
    qMsa.bindDataId(1, msaId2);
    qint64 msa2records = qMsa.selectInt64();
    CHECK_EQUAL(1, msa2records, "number of MSA2 records");

    // "Object"
    SQLiteReadQuery qObj("SELECT COUNT(*) FROM Object WHERE id = ?1", sqliteDbi->getDbRef(), os);
    qObj.bindDataId(1, msaId);
    qint64 msa1objects = qObj.selectInt64();
    CHECK_EQUAL(0, msa1objects, "number of MSA1 objects");

    qObj.reset(true);
    qObj.bindDataId(1, msaId2);
    qint64 msa2objects = qObj.selectInt64();
    CHECK_EQUAL(1, msa2objects, "number of MSA2 objects");

    // Remove the second alignment
    sqliteObjectDbi->removeObject(msaId2, os);
}
void TUIOSender::frame()
{	

	QString str_ID,str_x,str_y; // for use in debug window
	QString aliveCursors =  "",aliveObjects = "" ;

	if(!transmitSocket)
	{
		std::cout << "Socket Not Initialized " << "\n" ;
		return;
	}
	
	int currentTime = mywin->t.elapsed() ;
	int dt = lastTime - currentTime ;
	lastTime = currentTime ;
	
	char pbuffer[OUTPUT_BUFFER_SIZE]; // for set messages 
	char qbuffer[OUTPUT_BUFFER_SIZE]; // for alive and fseq message
	char qObjbuffer[OUTPUT_BUFFER_SIZE]; // for alive and fseq message
	osc::OutboundPacketStream p( pbuffer, OUTPUT_BUFFER_SIZE );
	osc::OutboundPacketStream q( qbuffer, OUTPUT_BUFFER_SIZE );
	osc::OutboundPacketStream qObj( qObjbuffer, OUTPUT_BUFFER_SIZE );
	
	p.Clear();
	p << osc::BeginBundle();
	
	q.Clear();
	q << osc::BeginBundle();
	qObj.Clear();
	qObj << osc::BeginBundle();
	
		q << osc::BeginMessage( "/tuio/2Dcur" ) << "alive" ;
		qObj << osc::BeginMessage( "/tuio/2Dobj" ) << "alive" ;
	
	if (Verbose) std::cout << "Table is active \t" << mywin->table->OSCdata->active<<"\n" ;

	if (mywin->table->OSCdata->active )
	{
		
		TouchData *d = mywin->table->OSCdata ;
		
		if (mywin->table->OSCdata->packetUpdate)
		{
			float dx = d->X - d->LX ;
			float dy = d->Y - d->LY ;
			float m = sqrtf((dx*dx) + (dy*dy));
			p << osc::BeginMessage( "/tuio/2Dcur" ) << "set" << d->ID << (d->X)/mywin->table->w << (d->Y)/mywin->table->h << dx/mywin->table->w << dy/mywin->table->h << m << osc::EndMessage;
			mywin->myDebug->setCursorList->addItem("Cursor Set   "+ str_ID.setNum(d->ID) +  "    X  " + str_x.setNum(d->X) + "     Y " + str_y.setNum(d->Y));
			mywin->myDebug->setCursorList->scrollToBottom();
			d->LX = d->X ;
			d->LY = d->Y ;
			if (Verbose) std::cout << "Table Crsor set" << "\n" ;
			mywin->table->OSCdata->packetUpdate = false ;
		}
		
		q << d->ID ;
		aliveCursors +=  "  " ;
		aliveCursors += str_ID.setNum(d->ID) ;
		
	
	
		
	}
	
	
	
	QList<QGraphicsItem *> list = mywin->scene->items(5,5,mywin->table->w,mywin->table->h,Qt::IntersectsItemShape);
	
	while (!(list.isEmpty()))
	{
		QGraphicsItem *localItem = list.takeFirst();

		Tangible_Type *myTangible = dynamic_cast<Tangible_Type*>(localItem);
		if ( !myTangible )
			continue;
		TouchData *d = myTangible->OSCdata ;
		
		if (Verbose) std::cout << "Packet Update" << d->packetUpdate << "\n" ;
		if ( d->packetUpdate )
		{
			float dx = d->X - d->LX ;
			float dy = d->Y - d->LY ;
			float m = sqrtf((dx*dx) + (dy*dy));
			if ( myTangible->tangible_type == 3 )
			{
				p << osc::BeginMessage( "/tuio/2Dcur" ) ;
				p << "set" << d->ID << (d->X)/mywin->table->w << (d->Y)/mywin->table->h << dx << dy << m << osc::EndMessage;
				mywin->myDebug->setCursorList->addItem("Cursor Set   "+ str_ID.setNum(d->ID) +  "    X  " + str_x.setNum(d->X) + "     Y " + str_y.setNum(d->Y));
				mywin->myDebug->setCursorList->scrollToBottom();
				if (Verbose) std::cout << "Animation Cursor Set  " << "\n" ;
			}
			else if ( myTangible->tangible_type == 1 || myTangible->tangible_type == 2 )
			{
				float n = 0 ;
				float speed = m/dt;
				float accel = (speed - lastSpeed)/dt ;
				lastSpeed = speed ; 
				float newm = sqrtf(m/2);
				//qDebug() << newm << endl ;

				p << osc::BeginMessage( "/tuio/2Dobj" ) ;
				p << "set" << d->ID  << d->tagID << (d->X)/mywin->table->w << (d->Y)/mywin->table->h << d->angle << newm << newm << n  << accel << n << osc::EndMessage;
				mywin->myDebug->setObjectList->addItem("Object Set   "+ str_ID.setNum(d->ID) +  "    X  " + str_x.setNum(d->X) + "     Y " + str_y.setNum(d->Y));
				mywin->myDebug->setObjectList->scrollToBottom();
				if (Verbose) std::cout << "Animation Object Set  " << "\n" ;
			}
			
			d->LX = d->X ;
			d->LY = d->Y ;
			d->packetUpdate = false ;
		}
		
			if ( myTangible->tangible_type == 3 )
			{
				//q << osc::BeginMessage( "/tuio/2Dcur" ) ;
				q << d->ID ;
				aliveCursors +=  "  " ;
				aliveCursors += str_ID.setNum(d->ID) ;
				
							
			}
			else if ( myTangible->tangible_type == 1 || myTangible->tangible_type == 2  )
			{
				qObj <<  d->ID ;
				aliveObjects +=  "  " ;
				aliveObjects += str_ID.setNum(d->ID) ;
				
				
			}
			
			
		
	}
	
	mywin->myDebug->aliveObjectList->addItem("Alive Objects   " + aliveObjects);
	mywin->myDebug->aliveObjectList->scrollToBottom();
	mywin->myDebug->aliveCursorList->addItem("Alive Cursors   " + aliveCursors);
	mywin->myDebug->aliveCursorList->scrollToBottom();
	q << osc::EndMessage;
	qObj << osc::EndMessage;
		
	
	fseq++;
	mywin->myDebug->fseqLabel->setText("Fseq  :   " + str_x.setNum(fseq));
	
	p << osc::BeginMessage( "/tuio/2Dcur" ) << "fseq" << fseq << osc::EndMessage;
	p << osc::EndBundle;
	q << osc::EndBundle;
		
	//std::cout << "P is ready " << p.IsReady() << "\n" ;
	//std::cout << "Q is ready " << q.IsReady() << "\n" ;
	
	if(q.IsReady())
		transmitSocket->Send( q.Data(), q.Size() );
		
	if(p.IsReady())
		transmitSocket->Send( p.Data(), p.Size() );

	
	
}