Skip to content

Commit

Permalink
mysql_stmt_bind_param insted of direct copying of BIND structures to
Browse files Browse the repository at this point in the history
stmt handle property.
mysql_stmt_row_tell/row_seek instead of direc MYSQL_ROWS pointer
manipulation.
Removed couple of TODO's(simple or done)
Fixed a bit my_dynamic_pos_cursor1 test
  • Loading branch information
lawrinn committed Oct 27, 2016
1 parent 0c101a2 commit 48bc3e1
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 42 deletions.
31 changes: 9 additions & 22 deletions ma_statement.c
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,6 @@ MYSQL_RES* FetchMetadata(MADB_Stmt *Stmt)
/* {{{ MADB_StmtReset - reseting Stmt handler for new use */
void MADB_StmtReset(MADB_Stmt *Stmt)
{
/* TODO: These all stuff has to be moved to a separate function, smth like MADB_StmtReset */
MADB_StmtFree(Stmt, SQL_CLOSE);
MADB_CLEAR_ERROR(&Stmt->Error);
MADB_FREE(Stmt->NativeSql);
Expand Down Expand Up @@ -686,16 +685,6 @@ SQLRETURN MADB_StmtPutData(MADB_Stmt *Stmt, SQLPOINTER DataPtr, SQLLEN StrLen_or
}
/* }}} */

/* TODO: This function doesn't seem to be used anywhere */
SQLULEN GetOffset(MADB_Stmt *Stmt, SQLUINTEGER Count, MADB_DescRecord *Record, SQLUINTEGER Size)
{
if (Stmt->Ard->Header.BindType)
return Stmt->Ard->Header.BindType * Count;
if (Size)
return Count * Size;
return Count * Record->OctetLength;
}

/* {{{ MADB_ExecutePositionedUpdate */
SQLRETURN MADB_ExecutePositionedUpdate(MADB_Stmt *Stmt)
{
Expand Down Expand Up @@ -1221,9 +1210,7 @@ SQLRETURN MADB_StmtExecute(MADB_Stmt *Stmt)
}
if (Stmt->ParamCount)
{
//TODO: mysql_stmt_bind_param(Stmt->stmt, Stmt->params);
memcpy(Stmt->stmt->params, Stmt->params, sizeof(MYSQL_BIND) * Stmt->ParamCount);
Stmt->stmt->send_types_to_server= 1;
mysql_stmt_bind_param(Stmt->stmt, Stmt->params);
}
ret= SQL_SUCCESS;

Expand Down Expand Up @@ -1654,7 +1641,7 @@ void SwitchEndianness(char *Src, SQLLEN SrcBytes, char *Dst, SQLLEN DstBytes)

/* {{{ MADB_FixFetchedValues
Converting and/or fixing fetched values if needed */
SQLRETURN MADB_FixFetchedValues(MADB_Stmt *Stmt, int RowNumber, MYSQL_ROWS *SaveCursor)
SQLRETURN MADB_FixFetchedValues(MADB_Stmt *Stmt, int RowNumber, MYSQL_ROW_OFFSET SaveCursor)
{
MADB_DescRecord *IrdRec, *ArdRec;
int i;
Expand Down Expand Up @@ -1684,7 +1671,7 @@ SQLRETURN MADB_FixFetchedValues(MADB_Stmt *Stmt, int RowNumber, MYSQL_ROWS *Save
{
MADB_SetError(&Stmt->Error, MADB_ERR_22002, NULL, 0);
if (SaveCursor)
Stmt->stmt->result_cursor= SaveCursor;
mysql_stmt_row_seek(Stmt->stmt, SaveCursor);
return Stmt->Error.ReturnValue;
}
}
Expand Down Expand Up @@ -1811,10 +1798,10 @@ SQLRETURN MADB_FixFetchedValues(MADB_Stmt *Stmt, int RowNumber, MYSQL_ROWS *Save
/* {{{ MADB_StmtFetch */
SQLRETURN MADB_StmtFetch(MADB_Stmt *Stmt, my_bool KeepPosition)
{
unsigned int j, rc;
SQLULEN ArraySize= Stmt->Ard->Header.ArraySize;
MADB_Desc *ArdDesc= Stmt->Ard;
MYSQL_ROWS *SaveCursor= NULL;
unsigned int j, rc;
SQLULEN ArraySize= Stmt->Ard->Header.ArraySize;
MADB_Desc *ArdDesc= Stmt->Ard;
MYSQL_ROW_OFFSET SaveCursor= NULL;

if (!Stmt->stmt)
return SQL_INVALID_HANDLE;
Expand All @@ -1831,7 +1818,7 @@ SQLRETURN MADB_StmtFetch(MADB_Stmt *Stmt, my_bool KeepPosition)
/* We don't know if any of the ARD parameter changed, so we need to rebind */
MADB_FREE(Stmt->result);
if (KeepPosition && Stmt->Options.CursorType != SQL_CURSOR_FORWARD_ONLY)
SaveCursor= Stmt->stmt->result_cursor;
SaveCursor= mysql_stmt_row_tell(Stmt->stmt);

if (Stmt->Ird->Header.ArrayStatusPtr)
{
Expand Down Expand Up @@ -1937,7 +1924,7 @@ SQLRETURN MADB_StmtFetch(MADB_Stmt *Stmt, my_bool KeepPosition)
}

if (KeepPosition && Stmt->Options.CursorType != SQL_CURSOR_FORWARD_ONLY && SaveCursor)
Stmt->stmt->result_cursor= SaveCursor;
mysql_stmt_row_seek(Stmt->stmt, SaveCursor);
return Stmt->Error.ReturnValue;
}
/* }}} */
Expand Down
33 changes: 13 additions & 20 deletions test/dyn_cursor.c
Original file line number Diff line number Diff line change
Expand Up @@ -183,28 +183,25 @@ ODBC_TEST(my_dynamic_pos_cursor1)
(SQLPOINTER)SQL_CURSOR_STATIC, 0));

/* set the cursor name as 'mysqlcur' on Stmt */
rc = SQLSetCursorName(Stmt, (SQLCHAR *)"mysqlcur", SQL_NTS);
CHECK_STMT_RC(Stmt, rc);
CHECK_STMT_RC(Stmt, SQLSetCursorName(Stmt, (SQLCHAR *)"mysqlcur", SQL_NTS));

rc = SQLBindCol(Stmt,1,SQL_C_LONG,&nData,0,NULL);
CHECK_STMT_RC(Stmt,rc);
CHECK_STMT_RC(Stmt, SQLBindCol(Stmt, 1, SQL_C_LONG, &nData, 0, NULL));

rc = SQLBindCol(Stmt,2,SQL_C_CHAR,szData,20,NULL);
CHECK_STMT_RC(Stmt,rc);
CHECK_STMT_RC(Stmt, SQLBindCol(Stmt, 2, SQL_C_CHAR, szData, sizeof(szData[0]), NULL));

rc = SQLSetStmtAttr(Stmt,SQL_ATTR_ROW_ARRAY_SIZE,(SQLPOINTER)3,0);
CHECK_STMT_RC(Stmt,rc);
CHECK_STMT_RC(Stmt, SQLSetStmtAttr(Stmt,SQL_ATTR_ROW_ARRAY_SIZE,(SQLPOINTER)3,0));

/* Open the resultset of table 'my_demo_cursor' */
OK_SIMPLE_STMT(Stmt, "SELECT * FROM my_dynamic_cursor");

/* goto the last row */
rc = SQLFetchScroll(Stmt, SQL_FETCH_ABSOLUTE, 5L);
CHECK_STMT_RC(Stmt,rc);
/* goto the last row
TODO: This does not really go to the last row - it fetches 3 rows(SQL_ATTR_ROW_ARRAY_SIZE) starting from 5th, and then cursor should be on 5th after the command */
CHECK_STMT_RC(Stmt, SQLFetchScroll(Stmt, SQL_FETCH_ABSOLUTE, 5L));

for (i=0; i < 5; i++)
for (i= 5; i < 5 + 3; i++)
{
diag("i %d nData: %d szData: %s", i, nData[i], szData[i]);
diag("i %d nData: %d szData: %s", i, nData[i - 5], szData[i - 5]);
is_num(i, nData[i - 5]);
}

/*rc = SQLSetPos(Stmt,SQL_POSITION,2,SQL_LOCK_NO_CHANGE);
Expand All @@ -213,19 +210,15 @@ ODBC_TEST(my_dynamic_pos_cursor1)
/* now update the name field to 'update' using positioned cursor */
OK_SIMPLE_STMT(hstmt_pos, "UPDATE my_dynamic_cursor SET id=999, name='updated' WHERE CURRENT OF mysqlcur");

rc = SQLRowCount(hstmt_pos, &nRowCount);
CHECK_STMT_RC(hstmt_pos, rc);
CHECK_STMT_RC(hstmt_pos, SQLRowCount(hstmt_pos, &nRowCount));

diag(" total rows updated:%d\n",nRowCount);
is_num(nRowCount, 1);
strcpy(szData[1],"updated");
nData[1] = 999;

rc = SQLSetPos(Stmt,2,SQL_DELETE,SQL_LOCK_NO_CHANGE);
CHECK_STMT_RC(Stmt,rc);

rc = SQLRowCount(Stmt, &nRowCount);
CHECK_STMT_RC(Stmt, rc);
CHECK_STMT_RC(Stmt,SQLSetPos(Stmt,2,SQL_DELETE,SQL_LOCK_NO_CHANGE));
CHECK_STMT_RC(Stmt, SQLRowCount(Stmt, &nRowCount));

diag(" total rows deleted:%d\n",nRowCount);
is_num(nRowCount, 1);
Expand Down

0 comments on commit 48bc3e1

Please sign in to comment.