Skip to content

Commit

Permalink
ODBC-161 FileDSN creation - fix and testcase
Browse files Browse the repository at this point in the history
I don't have the Win7 to test, but the problem was probably, that DM
allocates for ConnOutString buffer of max SQLSMALLINT size, and
connector internally works with utf8, and thux allocated own buffer x4
times bigger, and that made negative SQLSMALLINT number.
Also added SAVEFILE to the dsn structure, as it was required for some
logic changes mainly in the setup lib
Changed tests default driver name to 3.0
  • Loading branch information
lawrinn committed Jul 19, 2018
1 parent f0cd063 commit 8912f9f
Show file tree
Hide file tree
Showing 9 changed files with 86 additions and 26 deletions.
4 changes: 2 additions & 2 deletions dsn/odbc_dsn.c
Expand Up @@ -208,7 +208,7 @@ my_bool GetButtonState(int Dialog, int Button)

my_bool SaveDSN(HWND hDlg, MADB_Dsn *Dsn)
{
if (MADB_SaveDSN(Dsn))
if (Dsn->SaveFile != NULL || MADB_SaveDSN(Dsn))
return TRUE;
MessageBox(hDlg, Dsn->ErrorMsg, "Error", MB_OK);
return FALSE;
Expand Down Expand Up @@ -761,7 +761,7 @@ my_bool DSNDialog(HWND hwndParent,
else
{
/* i.e. not a prompt */
if (Dsn->isPrompt == MAODBC_CONFIG)
if (Dsn->isPrompt == MAODBC_CONFIG && Dsn->SaveFile == NULL)
{
if (!DsnExists)
{
Expand Down
24 changes: 20 additions & 4 deletions ma_connection.c
Expand Up @@ -1662,15 +1662,15 @@ void MADB_DriverSideFree(void *ptr)

/* {{{ MADB_DriverConnect */
SQLRETURN MADB_DriverConnect(MADB_Dbc *Dbc, SQLHWND WindowHandle, SQLCHAR *InConnectionString,
SQLSMALLINT StringLength1, SQLCHAR *OutConnectionString,
SQLSMALLINT BufferLength, SQLSMALLINT *StringLength2Ptr,
SQLULEN StringLength1, SQLCHAR *OutConnectionString,
SQLULEN BufferLength, SQLSMALLINT *StringLength2Ptr,
SQLUSMALLINT DriverCompletion)
{
MADB_Dsn *Dsn;
MADB_Drv *Drv= NULL;
SQLRETURN ret= SQL_SUCCESS;
MADB_Prompt DSNPrompt= { NULL, NULL };
SQLSMALLINT Length;
SQLULEN Length;

if (!Dbc)
return SQL_INVALID_HANDLE;
Expand Down Expand Up @@ -1767,15 +1767,31 @@ SQLRETURN MADB_DriverConnect(MADB_Dbc *Dbc, SQLHWND WindowHandle, SQLCHAR *InCon

ret= MADB_DbcConnectDB(Dbc, Dsn);
if (!SQL_SUCCEEDED(ret))
{
goto error;
}

end:
Dbc->Dsn= Dsn;
/* Dialog returns bitmap - syncing corresponding properties */
MADB_DsnUpdateOptionsFields(Dsn);
if (Dsn->isPrompt)
{
char *PreservePwd;

/* DM should do that on its own, but we still better also remove pwd from the string being saved in the file DSN */
if (Dsn->SaveFile != NULL)
{
PreservePwd= Dsn->Password;
Dsn->Password= NULL;
}
/* If prompt/complete(_required), and dialog was succusefully showed - we generate string from the result DSN */
Length= MADB_DsnToString(Dsn, (char *)OutConnectionString, BufferLength);

if (Dsn->SaveFile != NULL)
{
Dsn->Password= PreservePwd;
}
}
else
{
Expand All @@ -1791,7 +1807,7 @@ SQLRETURN MADB_DriverConnect(MADB_Dbc *Dbc, SQLHWND WindowHandle, SQLCHAR *InCon
Length= StringLength1;
}
if (StringLength2Ptr)
*StringLength2Ptr= (SQLSMALLINT)Length;
*StringLength2Ptr= Length;

if (OutConnectionString && BufferLength && Length > BufferLength)
{
Expand Down
4 changes: 2 additions & 2 deletions ma_connection.h
Expand Up @@ -44,8 +44,8 @@ struct st_ma_connection_methods
SQLRETURN(*GetInfo)(MADB_Dbc *Dnc, SQLUSMALLINT InfoType, SQLPOINTER InfoValuePtr,
SQLSMALLINT BufferLength, SQLSMALLINT *StringLengthPtr, my_bool isWChar);
SQLRETURN (*DriverConnect)(MADB_Dbc *Dbc, SQLHWND WindowHandle, SQLCHAR *InConnectionString,
SQLSMALLINT StringLength1, SQLCHAR *OutConnectionString,
SQLSMALLINT BufferLength, SQLSMALLINT *StringLength2Ptr,
SQLULEN StringLength1, SQLCHAR *OutConnectionString,
SQLULEN BufferLength, SQLSMALLINT *StringLength2Ptr,
SQLUSMALLINT DriverCompletion);
};

Expand Down
28 changes: 18 additions & 10 deletions ma_dsn.c
Expand Up @@ -65,8 +65,9 @@ MADB_DsnKey DsnKeys[]=
{"SSLCRL", offsetof(MADB_Dsn, SslCrl), DSN_TYPE_STRING, 0, 0},
{"SSLCRLPATH", offsetof(MADB_Dsn, SslCrlPath), DSN_TYPE_STRING, 0, 0},
{"SOCKET", offsetof(MADB_Dsn, Socket), DSN_TYPE_STRING, 0, 0},
{"SAVEFILE", offsetof(MADB_Dsn, SaveFile), DSN_TYPE_STRING, 0, 0}, /* 30 */
/* Aliases. Here offset is index of aliased key */
{"SERVERNAME", DSNKEY_SERVER_INDEX, DSN_TYPE_STRING, 0, 1}, /* 30 */
{"SERVERNAME", DSNKEY_SERVER_INDEX, DSN_TYPE_STRING, 0, 1},
{"USER", DSNKEY_UID_INDEX, DSN_TYPE_STRING, 0, 1},
{"PASSWORD", DSNKEY_PWD_INDEX, DSN_TYPE_STRING, 0, 1},
{"DB", DSNKEY_DATABASE_INDEX, DSN_TYPE_COMBO, 0, 1},
Expand Down Expand Up @@ -136,6 +137,7 @@ void MADB_DSN_Free(MADB_Dsn *Dsn)
MADB_FREE(Dsn->SslCrlPath);
MADB_FREE(Dsn->SslFp);
MADB_FREE(Dsn->SslFpList);
MADB_FREE(Dsn->SaveFile);

if (Dsn->FreeMe)
MADB_FREE(Dsn);
Expand Down Expand Up @@ -507,15 +509,15 @@ BOOL MADB_ReadConnString(MADB_Dsn *Dsn, const char *String, size_t Length, char
/* }}} */

/* {{{ MADB_DsnToString */
SQLSMALLINT MADB_DsnToString(MADB_Dsn *Dsn, char *OutString, SQLSMALLINT OutLength)
SQLULEN MADB_DsnToString(MADB_Dsn *Dsn, char *OutString, SQLULEN OutLength)
{
int i= 0;
SQLSMALLINT TotalLength= 0;
char *p= OutString;
char *Value= NULL;
char TmpStr[1024];
char IntVal[12];
int CpyLength;
int i= 0;
SQLULEN TotalLength= 0;
char *p= OutString;
char *Value= NULL;
char TmpStr[1024];
char IntVal[12];
int CpyLength;

if (OutLength && OutString)
OutString[0]= '\0';
Expand All @@ -524,11 +526,17 @@ SQLSMALLINT MADB_DsnToString(MADB_Dsn *Dsn, char *OutString, SQLSMALLINT OutLeng
{
Value= NULL;

if (!DsnKeys[i].IsAlias) {
if (!DsnKeys[i].IsAlias)
{
switch (DsnKeys[i].Type) {
case DSN_TYPE_STRING:
case DSN_TYPE_COMBO:
Value= *GET_FIELD_PTR(Dsn, &DsnKeys[i], char*);
if (MADB_IS_EMPTY(Value))
{
++i;
continue;
}
break;
case DSN_TYPE_INT:
if (*GET_FIELD_PTR(Dsn, &DsnKeys[i], int))
Expand Down
3 changes: 2 additions & 1 deletion ma_dsn.h
Expand Up @@ -120,6 +120,7 @@ typedef struct st_madb_dsn
char *SslFp;
char *SslFpList;
my_bool SslVerify;
char *SaveFile;
/* --- Internal --- */
int isPrompt;
MADB_DsnKey *Keys;
Expand All @@ -143,7 +144,7 @@ my_bool MADB_SaveDSN (MADB_Dsn *Dsn);
my_bool MADB_DSN_Exists (const char *DsnName);
my_bool MADB_ParseConnString(MADB_Dsn *Dsn, const char *String, size_t Length, char Delimiter);
BOOL MADB_ReadConnString (MADB_Dsn *Dsn, const char *String, size_t Length, char Delimiter);
SQLSMALLINT MADB_DsnToString (MADB_Dsn *Dsn, char *OutString, SQLSMALLINT OutLength);
SQLULEN MADB_DsnToString (MADB_Dsn *Dsn, char *OutString, SQLULEN OutLength);
void MADB_DsnUpdateOptionsFields(MADB_Dsn *Dsn);

/*** Helper macros ***/
Expand Down
8 changes: 4 additions & 4 deletions odbc_3_api.c
Expand Up @@ -973,7 +973,7 @@ SQLRETURN SQL_API SQLDriverConnectW(SQLHDBC ConnectionHandle,
SQLUSMALLINT DriverCompletion)
{
SQLRETURN ret= SQL_ERROR;
SQLSMALLINT Length= 0;
SQLULEN Length= 0; /* Since we need bigger(in bytes) buffer for utf8 string, the length may be > max SQLSMALLINT */
char *InConnStrA= NULL;
SQLULEN InStrAOctLen= 0;
char *OutConnStrA= NULL;
Expand Down Expand Up @@ -1008,18 +1008,18 @@ SQLRETURN SQL_API SQLDriverConnectW(SQLHDBC ConnectionHandle,
}
}

ret= Dbc->Methods->DriverConnect(Dbc, WindowHandle, (SQLCHAR *)InConnStrA, (SQLSMALLINT)InStrAOctLen, (SQLCHAR *)OutConnStrA,
ret= Dbc->Methods->DriverConnect(Dbc, WindowHandle, (SQLCHAR *)InConnStrA, InStrAOctLen, (SQLCHAR *)OutConnStrA,
Length, StringLength2Ptr, DriverCompletion);
MDBUG_C_DUMP(Dbc, ret, d);
if (!SQL_SUCCEEDED(ret))
goto end;

if (OutConnectionString)
{
Length= (SQLSMALLINT)MADB_SetString(&utf8, OutConnectionString, BufferLength,
Length= MADB_SetString(&utf8, OutConnectionString, BufferLength,
OutConnStrA, SQL_NTS, &((MADB_Dbc *)ConnectionHandle)->Error);
if (StringLength2Ptr)
*StringLength2Ptr= Length;
*StringLength2Ptr= (SQLSMALLINT)Length;
}

end:
Expand Down
4 changes: 2 additions & 2 deletions test/basic.c
Expand Up @@ -1656,7 +1656,7 @@ ODBC_TEST(t_odbc162)

MA_ODBC_TESTS my_tests[]=
{
/*{t_disconnect, "t_disconnect", NORMAL},
{t_disconnect, "t_disconnect", NORMAL},
{t_describe_nulti, "t_describe_nulti", NORMAL},
{test_CONO1, "test_CONO1", NORMAL},
{test_CONO3, "test_CONO3", NORMAL},
Expand Down Expand Up @@ -1697,7 +1697,7 @@ MA_ODBC_TESTS my_tests[]=
{t_odbc137, "odbc137_ansi", NORMAL},
#ifdef _WIN32
{t_odbc139, "odbc139_compression", NORMAL},
#endif*/
#endif
{t_odbc162, "t_odbc162_CTE_query", NORMAL },
{NULL, NULL, 0}
};
Expand Down
31 changes: 31 additions & 0 deletions test/interactive.c
Expand Up @@ -120,6 +120,36 @@ ODBC_TEST(ti_dialogs)
return OK;
}


ODBC_TEST(t_odbc161)
{
HDBC hdbc1;
SQLCHAR conn[512], conn_out[1024];
SQLSMALLINT conn_out_len;

sprintf((char *)conn, "SAVEFILE=odbc161;DRIVER=%s;UID=%s;PWD=%s;SERVER=%s;PORT=%u;DB=%s",
my_drivername, my_uid, my_pwd, my_servername, my_port, my_schema);

CHECK_ENV_RC(Env, SQLAllocHandle(SQL_HANDLE_DBC, Env, &hdbc1));

CHECK_DBC_RC(hdbc1, SQLDriverConnect(hdbc1, NULL, conn, (SQLSMALLINT)strlen(conn),
conn_out, (SQLSMALLINT)sizeof(conn_out), &conn_out_len,
SQL_DRIVER_COMPLETE_REQUIRED));

CHECK_DBC_RC(hdbc1, SQLDisconnect(hdbc1));

sprintf((char *)conn, "FILEDSN=odbc161;PWD=%s", my_pwd);

CHECK_DBC_RC(hdbc1, SQLDriverConnect(hdbc1, NULL, conn, (SQLSMALLINT)strlen(conn),
conn_out, (SQLSMALLINT)sizeof(conn_out), &conn_out_len,
SQL_DRIVER_COMPLETE_REQUIRED));

CHECK_DBC_RC(hdbc1, SQLDisconnect(hdbc1));
CHECK_DBC_RC(hdbc1, SQLFreeHandle(SQL_HANDLE_DBC, hdbc1));

return OK;
}

#ifdef _WIN32
# define WE_HAVE_SETUPLIB
#endif
Expand All @@ -129,6 +159,7 @@ MA_ODBC_TESTS my_tests[]=
#ifdef WE_HAVE_SETUPLIB
{ti_bug30840, "bug30840_interactive", NORMAL},
{ti_dialogs, "ti_dialogs", NORMAL},
{t_odbc161, "t_odbc161_file_dsn", NORMAL},
#endif
{NULL, NULL, 0}
};
Expand Down
6 changes: 5 additions & 1 deletion test/tap.h
Expand Up @@ -115,7 +115,7 @@ static SQLCHAR *my_dsn= (SQLCHAR *)"test";
static SQLCHAR *my_uid= (SQLCHAR *)"root";
static SQLCHAR *my_pwd= (SQLCHAR *)"";
static SQLCHAR *my_schema= (SQLCHAR *)"odbc_test";
static SQLCHAR *my_drivername= (SQLCHAR *)"MariaDB Connector/ODBC 2.0";
static SQLCHAR *my_drivername= (SQLCHAR *)"MariaDB Connector/ODBC 3.0";
static SQLCHAR *my_servername= (SQLCHAR *)"localhost";

static SQLWCHAR *wdsn;
Expand Down Expand Up @@ -202,6 +202,7 @@ void usage()
{
fprintf(stdout, "Valid options:\n");
fprintf(stdout, "-d DSN Name\n");
fprintf(stdout, "-D Driver Name\n");
fprintf(stdout, "-u Username\n");
fprintf(stdout, "-p Password\n");
fprintf(stdout, "-s default database (schema)\n");
Expand Down Expand Up @@ -283,6 +284,9 @@ void get_options(int argc, char **argv)
case 'S':
my_servername= (SQLCHAR*)argv[i+1];
break;
case 'D':
my_drivername= (SQLCHAR*)argv[i+1];
break;
case '?':
usage();
exit(0);
Expand Down

0 comments on commit 8912f9f

Please sign in to comment.