1. C++ / Говнокод #9219

    +130

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    BOOL CMarkup::Search(CString OprName, CString strSQL, short nType)
    {
    
    ...
    	
    	sCommandLine = sPath.Left(nPos)+ _T("\\Getorder.exe search ")+OprName+_T(" ")+strSQL+_T(" ")+strType;
    	::wcscpy(cCommandLine, sCommandLine);
    
    	BOOL ret = CreateProcess(NULL, cCommandLine, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
    	if (ret) {
    		CloseHandle(pi.hThread );						//Close the thread handle as soon as it is no longer needed.
    		WaitForSingleObject(pi.hProcess, INFINITE);		//Suspend our execution until the child has terminated.
    		GetExitCodeProcess(pi.hProcess ,&dwExitCode);	//The child process terminated;get its exit code.
    		//if(dwExitCode == STILL_ACTIVE) TerminateProcess(pi.hProcess, 0);
    		CloseHandle(pi.hProcess);						//Close the process handle as soon as it is no longer needed.
    	}
    
    	CString ss,s;
    	ss = _T("s.txt");
    
    	CStdioFile in;
    	if(!in.Open (sPath+_T("\\")+ss,CFile::modeRead | CFile::typeBinary))
    		return TRUE;
    
    	while(in.ReadString(s))
    	{
    		s.TrimLeft();
    		s.TrimRight();
    		if(s != _T("**********")) continue;
    
    		ORDERTYPE m_OrderData;
    
    		in.ReadString(s);
    		s.TrimLeft();
    		s.TrimRight();
    		m_OrderData.OprName = s;
    
    		in.ReadString(s);
    		s.TrimLeft();
    		s.TrimRight();
    		m_OrderData.Language =s;
    
    		in.ReadString(s);
    		s.TrimLeft();
    		s.TrimRight();
    		m_OrderData.OrderNo =s;
    
    ...
    
    	}
    
    	in.Close();
    	DeleteFile(sPath+_T("\\")+ss);

    Прислали исходники приложения на C++ с MFC. Там просто один сплошной ГК от начала и до конца, но это место просто убило.

    Задача - найти заказ в базе данных MSSQL по SQL-запросу. Для этого они запускают отдельное приложение .NET, которое подключается к базе и дампит запись в текстовый файл, а приложение C++ из него читает.

    Запостил: someone, 25 Января 2012

    Комментарии (13) RSS

    • Вброшу.
      Это Unix-way. В лялихе так принято: использовать мелкие программки для решения задач. Если уже есть прожка, выполняющая поиск нужным образом, то именно её и вызываем из нашей. Результат получаем через текстовый файл, всё верно.
      Так что писал явно луноход, перешедший на винду.
      :D
      Ответить
      • лучше уж пайпами, чем файлами текстовыми.
        Ответить
        • Эти чудики ниасилили:

          1. Обращение к MSSQL из C++
          2. Вызов .NET DLL через COM Interop, если уж ниасилили 1
          3. Ну ладно, не знают про 1 и 2, но про пайпы-то должны знать, это святое!
          Ответить
      • это говновэй в N слоев
        на верхнем слое говновей в том, что результат складывается в текстовый файл, имя которого явно захардкожено как в этом коде, так и в коде дотнетовской отрыжки, и поэтому надо как то следить чтобы никто кроме нас не запустил эту утилиту параллельно, и никто кроме нас не смог почитать и удалить файл - имеем заведомо однопоточность, уверен что с нерешенными конфликтами
        на слое пониже - вызывается утилита через командную строку, что крайне медленно и небезопасно (вся безопасность сводится к правам на запуск утилиты пользователем текущего процесса), хотя существует способ засунуть дотнетовский код в длл и вызывать методы из оной, затем приходится тупейшим способом парсить текстовый файл
        на слое еще пониже - кто и на каком этапе делает авторизацию к базе? всё в утилите? тоже захардкожено?
        на слое еще пониже - тотальный говнокод и низкая культура реализации даже задуманного
        ну и "не можем открыть файл с результатами - ну и пох, возвратим TRUE" - умилило
        Ответить
      • >> C++ с MFC ... MSSQL по SQL-запросу ... .NET
        > Это Unix-way. В лялихе так принято
        Ути-пути
        Ответить
        • > Так что писал явно луноход, перешедший на винду.
          Ответить
          • У вас часть мозга, ответвественная за телепатию, непомерно разрослась.
            Ответить
      • В линухе принято DRY.
        так что писал явно виндомозглый дебил.
        Ответить
      • Хе-хе-хе. Ай да вбросил!
        PS. Я хотел минусануть но промазал.
        Ответить
    • интересно, а сколько в оригинальной функции строк?
      Ответить
      • 357. Из них 275 - тупой копипаст строк 33-46 из приведённого куска.

        И этот же способ обращения к БД в том же cpp-файле методом копипаста распространён ещё на несколько других таблиц...
        Ответить
        • Требуй долива... после отстоя пены!^W^W^Wмолока за вредность.
          Ответить
    • показать все, что скрытоvanished
      Ответить

    Добавить комментарий