int main(int argc, char** argv) { char buffer[BUFSIZE]; char result[BUFSIZE]; char *dsn = getenv("DSN"); char *uid = getenv("UID"); char *pwd = getenv("PWD"); if (SQL_SUCCESS != (rc = SQLAllocEnv (&henv))) { odbc_error (); return -1; } if (SQL_SUCCESS != (rc = SQLAllocConnect (henv, &hdbc))) { odbc_error (); return -1; } if (SQL_SUCCESS != (rc = SQLConnect (hdbc, dsn ? dsn : "1111", SQL_NTS, uid ? uid : "dba", SQL_NTS, pwd ? pwd : "dba", SQL_NTS))) { odbc_error (); return -1; } if (SQL_SUCCESS != (rc = SQLAllocStmt (hdbc, &hstmt))) { odbc_error (); return -1; } while (NULL != fgets (buffer, BUFSIZE, stdin)) { if (SQL_SUCCESS != (rc = SQLBindParameter (hstmt, 3, SQL_PARAM_OUTPUT, SQL_C_CHAR, SQL_CHAR, sizeof (result), 0, result, sizeof (result), NULL))) { odbc_error (); break; } if (0 == strncmp ("chdir", buffer, 5)) { if (SQL_SUCCESS != (rc = SQLSetParam (hstmt, 1, SQL_C_CHAR, SQL_CHAR, 0, 0, replace_newline (buffer + 6), NULL))) { odbc_error (); break; } if (SQL_SUCCESS != (rc = SQLSetParam (hstmt, 2, SQL_C_CHAR, SQL_CHAR, 0, 0, "", NULL))) { odbc_error (); break; } if (SQL_SUCCESS != (rc = SQLExecDirect (hstmt, "XSLT_CHDIR (?, ?, ?)", SQL_NTS))) { odbc_error (); break; } /*change directory:*/ printf ("%s\n", result); fflush (stdout); } else if (0 == strncmp ("stylesheet", buffer, 10)) { /*load stylesheet: */ if (SQL_SUCCESS != (rc = SQLSetParam (hstmt, 1, SQL_C_CHAR, SQL_CHAR, 0, 0, replace_newline (&buffer[11]), NULL))) { odbc_error (); break; } if (SQL_SUCCESS != (rc = SQLSetParam (hstmt, 2, SQL_C_CHAR, SQL_CHAR, 0, 0, "", NULL))) { odbc_error (); break; } if (SQL_SUCCESS != (rc = SQLExecDirect (hstmt, "XSLT_STYLESHEET (?, ?, ?)", SQL_NTS))) { odbc_error (); break; } printf ("%s\n", result); fflush (stdout); } else if (0 == strncmp ("input", buffer, 5)) { if (SQL_SUCCESS != (rc = SQLSetParam (hstmt, 1, SQL_C_CHAR, SQL_CHAR, 0, 0, replace_newline (&buffer[6]), NULL))) { odbc_error (); break; } if (SQL_SUCCESS != (rc = SQLSetParam (hstmt, 2, SQL_C_CHAR, SQL_CHAR, 0, 0, "", NULL))) { odbc_error (); break; } if (SQL_SUCCESS != (rc = SQLExecDirect (hstmt, "XSLT_INPUT (?, ?, ?)", SQL_NTS))) { odbc_error (); break; } printf ("%s\n", result); fflush (stdout); } else if (0 == strncmp ("transform", buffer, 9)) { short iter = 1; char * c = buffer+10; char *filename; timer_account_t ta; /* get output filename */ while (*c != '\n' && *c != '\0' && *c != ' ') { c++; } if (*c == ' ') { *c = 0; c++; filename = buffer + 10; } /* get # of iterations */ iter = atoi(c); if (iter <= 0) iter = 1; /* printf ("file: %s iter : %d buffer %s\n", filename, iter, buffer); */ ta_init (&ta, "test"); ta_enter (&ta); if (SQL_SUCCESS != (rc = SQLSetParam (hstmt, 1, SQL_C_CHAR, SQL_CHAR, 0, 0, filename, NULL))) { odbc_error (); break; } if (SQL_SUCCESS != (rc = SQLSetParam (hstmt, 2, SQL_C_SHORT, SQL_INTEGER, 0, 0, &iter, NULL))) { odbc_error (); break; } if (SQL_SUCCESS != (rc = SQLExecDirect (hstmt, "XSLT_TRANSFORM (?, ?, ?)", SQL_NTS))) { odbc_error (); break; } ta_leave (&ta); printf ("OK wallclock: %06ld ms; cpuclock: %06ld'\n", ta.ta_total, ta.ta_total); fflush (stdout); } else if (0 == strncmp ("terminate", buffer, 9)) { printf ("OK\n"); break; } if (SQL_SUCCESS != (rc = SQLFreeStmt (hstmt, SQL_CLOSE))) { odbc_error (); return -1; } if (SQL_SUCCESS != (rc = SQLFreeStmt (hstmt, SQL_RESET_PARAMS))) { odbc_error (); return -1; } } if (SQL_SUCCESS != (rc = SQLFreeStmt (hstmt, SQL_DROP))) return -1; if (SQL_SUCCESS != (rc = SQLDisconnect (hdbc))) return -1; if (SQL_SUCCESS != (rc = SQLFreeConnect (hdbc))) return -1; if (SQL_SUCCESS != (rc = SQLFreeEnv (henv))) return -1; return 0; }
static int odbc_dispatch7(void) { unsigned long retval; PWord rval; int rtype; PWord arg1; int type1; PWord arg2; int type2; PWord arg3; int type3; PWord arg4; int type4; PWord arg5; int type5; PWord arg6; int type6; PWord arg7; int type7; PWord arg8; int type8; PWord arg9; int type9; PWord arg10; int type10; PI_getan(&arg1,&type1,1); if (type1 != PI_INT) if (!CI_get_integer((unsigned long *)&arg1,type1)) PI_FAIL; PI_getan(&arg2,&type2,2); if (type2 != PI_INT) if (!CI_get_integer((unsigned long *)&arg2,type2)) PI_FAIL; PI_getan(&arg3,&type3,3); if (type3 != PI_INT) if (!CI_get_integer((unsigned long *)&arg3,type3)) PI_FAIL; PI_getan(&arg4,&type4,4); if (type4 != PI_INT) if (!CI_get_integer((unsigned long *)&arg4,type4)) PI_FAIL; PI_getan(&arg5,&type5,5); if (type5 != PI_INT) if (!CI_get_integer((unsigned long *)&arg5,type5)) PI_FAIL; PI_getan(&arg6,&type6,6); if (type6 != PI_INT) if (!CI_get_integer((unsigned long *)&arg6,type6)) PI_FAIL; PI_getan(&arg7,&type7,7); if (type7 != PI_INT) if (!CI_get_integer((unsigned long *)&arg7,type7)) PI_FAIL; PI_getan(&arg8,&type8,8); if (type8 != PI_INT) if (!CI_get_integer((unsigned long *)&arg8,type8)) PI_FAIL; PI_getan(&arg9,&type9,9); if (type9 != PI_INT) if (!CI_get_integer((unsigned long *)&arg9,type9)) PI_FAIL; PI_getan(&arg10,&type10,10); switch(arg1) { case 0: retval = (unsigned long) SQLSetParam(((SQLHSTMT ) arg2),((SQLUSMALLINT ) arg3),((SQLSMALLINT ) arg4),((SQLSMALLINT ) arg5),((SQLUINTEGER ) arg6),((SQLSMALLINT ) arg7),((SQLPOINTER ) arg8),((SQLINTEGER * ) arg9)); break; case 1: retval = (unsigned long) SQLBindParam(((SQLHSTMT ) arg2),((SQLUSMALLINT ) arg3),((SQLSMALLINT ) arg4),((SQLSMALLINT ) arg5),((SQLUINTEGER ) arg6),((SQLSMALLINT ) arg7),((SQLPOINTER ) arg8),((SQLINTEGER * ) arg9)); break; default: PI_FAIL; } PI_makedouble(&rval,&rtype,(double) retval); if (PI_unify(arg10,type10,rval,rtype)) PI_SUCCEED; PI_FAIL; }
DWORD WINAPI thread_func (LPVOID param) { thread_t *t = (thread_t *)param; char szStrTo[512]; RETCODE rc; SDWORD cbRet = SQL_DATA_AT_EXEC, cb1 = SQL_NULL_DATA, cb2 = SQL_NULL_DATA, cb3 = SQL_NULL_DATA, cb4 = SQL_NULL_DATA, cb5 = SQL_NULL_DATA, cb6 = SQL_NULL_DATA, cb7 = SQL_NULL_DATA, cb8 = SQL_NULL_DATA; szStrTo[0] = 0; ::WideCharToMultiByte (CP_ACP, 0, t->bStrTo, -1, szStrTo, sizeof (szStrTo), NULL, NULL); CDBConnection *conn = _ppool->getConnection(); // _Module.LogEvent ("After conn"); // _Module.LogEvent ("From: %s, To: %s, CC: %s, BCC: %s, Subject: %s, SentOn :%s", // szStrFrom, szStrTo, szStrCC, szStrBCC, szStrSubj, szStrSent); long ofs = 0; char szTo[512]; while (-1 != (ofs = GetNextID (szStrTo, ofs, szTo))) { cb1 = SQL_NULL_DATA; HSTMT hstmt = SQL_NULL_HSTMT; try { int reconnect_count; again: reconnect_count = 0; hstmt = SQL_NULL_HSTMT; if (SQL_SUCCESS != SQLAllocStmt (conn->hdbc, &hstmt)) throw _T ("SQLAllocStmt error"); // SQLSetStmtOption (hstmt, SQL_QUERY_TIMEOUT, 10); SQLSetParam (hstmt, 1, SQL_C_CHAR, SQL_CHAR, 0, 0, szTo, szTo[0] ? NULL : &cb1); SQLSetParam (hstmt, 2, SQL_C_WCHAR, SQL_CHAR, 0, 0, t->bStrSubj, t->bStrSubj[0] ? NULL : &cb2); SQLSetParam (hstmt, 3, SQL_C_WCHAR, SQL_CHAR, 0, 0, t->bStrCC, t->bStrCC[0] ? NULL : &cb3); SQLSetParam (hstmt, 4, SQL_C_WCHAR, SQL_CHAR, 0, 0, t->bStrBCC, t->bStrBCC[0] ? NULL : &cb4); SQLSetParam (hstmt, 5, SQL_C_WCHAR, SQL_CHAR, 0, 0, t->bStrSent, t->bStrSent[0] ? NULL : &cb5); SQLSetParam (hstmt, 6, SQL_C_WCHAR, SQL_CHAR, 0, 0, t->bStrTo, t->bStrTo[0] ? NULL : &cb6); SQLSetParam (hstmt, 7, SQL_C_WCHAR, SQL_CHAR, 0, 0, t->bStrFrom, t->bStrFrom[0] ? NULL : &cb7); SQLSetParam (hstmt, 8, SQL_C_WCHAR, SQL_LONGVARCHAR, 0, 0, t->bStrContent, t->bStrContent[0] ? NULL : &cb8); // _Module.LogEvent ("After setparam"); rc = SQLExecDirect (hstmt, (SQLCHAR *)"BARE_NEW_MAIL (?, ?, ?, ?, ?, ?, ?, ?)", SQL_NTS); if (rc != SQL_SUCCESS && !reconnect_count) { conn->ReportODBCError (hstmt, "Retry SQLExec error"); _Module.LogEvent ("Reconnecting ..."); reconnect_count = 1; SQLFreeStmt (hstmt, SQL_DROP); hstmt = SQL_NULL_HSTMT; delete conn; conn = new CDBConnection (); goto again; } else if (rc != SQL_SUCCESS) { throw _T("SQLExec Error"); } SQLFreeStmt (hstmt, SQL_DROP); // SQLFreeStmt (hstmt, SQL_RESET_PARAMS); _Module.LogEvent ("Message (%ld chars) from %s routed to %s", wcslen (t->bStrContent), (char *)(bstr_t)t->bStrFrom, (char *)(bstr_t)t->bStrTo); } catch (TCHAR *ch) { int deadlock = conn->ReportODBCError (hstmt, ch); // SQLFreeStmt (hstmt, SQL_RESET_PARAMS); if (deadlock) goto again; _ppool->releaseConnection(conn); delete t; } } _ppool->releaseConnection(conn); delete t; return 0; }
HRESULT CNNTP::OnPost(IMessage * Msg, CdoEventStatus * EventStatus) { HRESULT res; RETCODE rc; long global_read = 0; int to_inx = 0; SDWORD cbRet = SQL_DATA_AT_EXEC; if (EventStatus == NULL) return E_POINTER; // _Module.LogEvent ("Message"); CComBSTR bStrTo, bStrBody, bStrFrom, bStrSubj, bStrCC, bStrBCC, bStrSentDate; CComPtr<_Stream> st; VARIANT sent_date; ::VariantInit (&sent_date); sent_date.vt = VT_DATE; // _Module.LogEvent ("After Subj"); if (S_OK != (res = Msg->GetStream (&st))) return res; // _Module.LogEvent ("After Stream"); CDBConnection *conn = _ppool->getConnection(); // _Module.LogEvent ("After conn"); // _Module.LogEvent ("From: %s, To: %s, CC: %s, BCC: %s, Subject: %s, SentOn :%s", // szStrFrom, szStrTo, szStrCC, szStrBCC, szStrSubj, szStrSent); HSTMT hstmt = SQL_NULL_HSTMT; try { int read, reconnect_count = 0; char szBuffer[4096]; again: hstmt = SQL_NULL_HSTMT; if (SQL_SUCCESS != SQLAllocStmt (conn->hdbc, &hstmt)) throw _T("SQLAllocStmt error"); // SQLSetStmtOption (conn->hstmt, SQL_QUERY_TIMEOUT, 10); SQLSetParam (hstmt, 1, SQL_C_CHAR, SQL_LONGVARCHAR, 0, 0, (SQLPOINTER)2, &cbRet); // _Module.LogEvent ("After setparam"); rc = SQLExecDirect (hstmt, (SQLCHAR *)"NS_POST (?)", SQL_NTS); if (rc != SQL_NEED_DATA && !reconnect_count) { conn->ReportODBCError (hstmt, "Retry SQLExec error"); SQLFreeStmt (hstmt, SQL_DROP); hstmt = SQL_NULL_HSTMT; _Module.LogEvent ("Reconnecting ..."); reconnect_count = 1; delete conn; conn = new CDBConnection (); goto again; } else if (rc != SQL_NEED_DATA) { throw _T("SQLExec Error"); } // _Module.LogEvent ("After Exec"); rc = SQLParamData (hstmt, NULL); if (rc != SQL_NEED_DATA) throw _T("SQLParamData error"); // _Module.LogEvent ("After ParamData"); while (1) { st->ReadText (4096, &bStrBody); read = wcslen (bStrBody); global_read += read; // _Module.LogEvent ("After ReadText"); if (!read) break; ::WideCharToMultiByte (CP_ACP, 0, bStrBody, -1, szBuffer, sizeof (szBuffer), NULL, NULL); rc = SQLPutData (hstmt, szBuffer, SQL_NTS); // _Module.LogEvent ("After PutData"); if (rc != SQL_SUCCESS) throw _T("SQLPutData error"); } rc = SQLParamData (hstmt, NULL); // _Module.LogEvent ("After ParamData"); if (rc != SQL_SUCCESS) throw _T("SQLParamData error"); SQLFreeStmt (hstmt, SQL_DROP); // SQLFreeStmt (conn->hstmt, SQL_RESET_PARAMS); _Module.LogEvent ("NNTP Message (%ld chars) routed", global_read); } catch (TCHAR *ch) { conn->ReportODBCError (hstmt, ch); SQLFreeStmt (hstmt, SQL_DROP); // SQLFreeStmt (conn->hstmt, SQL_RESET_PARAMS); _ppool->releaseConnection(conn); return E_POINTER; } _ppool->releaseConnection(conn); return S_OK; }
int main (int argc, char ** argv) { int c, readed = 0; FILE *fd = NULL; char buf [4096]; SQLLEN cbParam; SQLRETURN retcode; SQLPOINTER pToken; FILE *cfg; char *ini = NULL, suid[128], spwd[128]; if (argc < 1) { fprintf (stderr, "Type -? for help\n"); return ERR_USAGE; } while ((c = getopt (argc, argv, "b:s:w:r:f:i:")) != EOF) { switch (c) { case 'b': dsn = optarg; break; case 's': uid = optarg; break; case 'w': pwd = optarg; break; case 'r': uname = optarg; break; case 'i': ini = optarg; break; case '?': fprintf (stderr, "Usage: %s -b [DSN] -s [UID] -w [PWD] -r [RCPT] -i [INI_FILE]\n", argv [0]); return 0; break; } } if ((argc < 4 && !ini) || (argc < 3 && ini)) { fprintf (stderr, "%s: missing arguments\nTry -? for help\n", argv [0]); return ERR_USAGE; } if (ini) { cfg = fopen (ini, "rt"); if (!cfg) { fprintf (stderr, "%s: cannot open config file\n", argv [0]); return ERR_USAGE; } suid[0] = 0; spwd[0] = 0; fscanf (cfg, "%s %s", suid, spwd); uid = suid; pwd = spwd; fclose (cfg); } SQLAllocEnv (&henv); SQLAllocConnect (henv, &hdbc); if (SQL_ERROR == SQLConnect (hdbc, (UCHAR *) dsn, SQL_NTS, (UCHAR *) uid, SQL_NTS, (UCHAR *) pwd, SQL_NTS)) { fprintf (stderr, "Database connect failed DSN:%s UID:%s PWD:%s\n", dsn, uid, pwd); return ERR_TEMP; } SQLAllocStmt (hdbc, &new_mail); if (SQL_ERROR == SQLPrepare (new_mail, (UCHAR *) new_mail_st, SQL_NTS)) { fprintf (stderr, "Statement prepare fails\n"); return ERR_SOFT; } SQLSetParam (new_mail, 1, SQL_C_CHAR, SQL_CHAR, 0,0, uname, NULL); SQLBindParameter(new_mail, 2, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_LONGVARBINARY, 0, 0, (SQLPOINTER) 2, 0, &cbParam); cbParam = SQL_DATA_AT_EXEC; deadlock_no: retcode = SQLExecute (new_mail); if (retcode != SQL_NEED_DATA) { char state [10], msg [256]; if (SQL_SUCCESS == SQLError (SQL_NULL_HENV, SQL_NULL_HDBC, new_mail, state, NULL, msg, 256, NULL)) fprintf (stderr, "SQL Error status code: %s description: %s\n", state, msg); if (0 == strcmp (state, "40001")) goto deadlock_no; /*return ERR_TEMP;*/ return ERR_SOFT; } fd = stdin; while (retcode == SQL_NEED_DATA) { retcode = SQLParamData(new_mail, &pToken); if (retcode == SQL_NEED_DATA) { while (!feof (fd)) { memset (buf, '\x0', sizeof (buf)); readed = fread (buf, sizeof (buf) - 1, 1L, fd); SQLPutData(new_mail, buf, strlen (buf)); } } } return 0; };