static void test_MsiRecordGetInteger(void) { MSIHANDLE rec; INT val; UINT r; rec = MsiCreateRecord(1); ok(rec != 0, "Expected a valid handle\n"); r = MsiRecordSetStringA(rec, 1, "5"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); val = MsiRecordGetInteger(rec, 1); ok(val == 5, "Expected 5, got %d\n", val); r = MsiRecordSetStringA(rec, 1, "-5"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); val = MsiRecordGetInteger(rec, 1); ok(val == -5, "Expected -5, got %d\n", val); r = MsiRecordSetStringA(rec, 1, "5apple"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); val = MsiRecordGetInteger(rec, 1); ok(val == MSI_NULL_INTEGER, "Expected MSI_NULL_INTEGER, got %d\n", val); MsiCloseHandle(rec); }
extern "C" void ReportMessage(int level, LPCSTR msg, LPCSTR str, LPCWSTR wstr, DWORD dw) { if(dwReporterType == REPORT_PRINTF) printf("%s:[%s][%S][%d]\n", (msg?msg:""), (str?str:""), (wstr?wstr:L""), dw); else if(dwReporterType == REPORT_MSI && hMsiHandle && level == 0) { MSIHANDLE hRec = MsiCreateRecord(5); MsiRecordClearData(hRec); MsiRecordSetStringA(hRec,1,(msg)?msg:""); MsiRecordSetStringA(hRec,2,(str)?str:""); MsiRecordSetStringW(hRec,3,(wstr)?wstr:L""); MsiRecordSetInteger(hRec,4,dw); MsiProcessMessage(hMsiHandle,INSTALLMESSAGE_ACTIONDATA,hRec); MsiCloseHandle(hRec); } }
extern "C" void SetMsiReporter(LPCSTR strAction, LPCSTR strDesc,DWORD h) { dwReporterType = REPORT_MSI; hMsiHandle = h; #ifdef DONT_NEED /* this is performed in the Wix installer */ MSIHANDLE hRec = MsiCreateRecord(4); MsiRecordClearData(hRec); MsiRecordSetStringA(hRec,1,strAction); MsiRecordSetStringA(hRec,2,strDesc); MsiRecordSetStringA(hRec,3,"[1]:([2])([3])([4])"); MsiProcessMessage(h,INSTALLMESSAGE_ACTIONSTART, hRec); MsiCloseHandle(hRec); #endif }
/* Print a debug message to the installer log file. * To see the debug messages, install with * msiexec /i pythonxy.msi /l*v python.log */ static UINT debug(MSIHANDLE hInstall, LPCSTR msg) { MSIHANDLE hRec = MsiCreateRecord(1); if (!hRec || MsiRecordSetStringA(hRec, 1, msg) != ERROR_SUCCESS) { return ERROR_INSTALL_FAILURE; } MsiProcessMessage(hInstall, INSTALLMESSAGE_INFO, hRec); MsiCloseHandle(hRec); return ERROR_SUCCESS; }
static void logString(MSIHANDLE hInstall, LPCSTR szString, ...) { PMSIHANDLE newHandle = MsiCreateRecord(2); char szBuffer[1024]; va_list va; va_start(va, szString); _vsnprintf(szBuffer, sizeof(szBuffer), szString, va); va_end(va); MsiRecordSetStringA(newHandle, 0, szBuffer); MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_INFO), newHandle); MsiCloseHandle(newHandle); #if 0/*def DEBUG - wrong? What does '%s' expect, wchar or char? */ _tprintf(_T("Debug: %s\n"), szBuffer); #endif }
void x_msg_va(const unsigned int flags, const char *format, va_list arglist) { /* Secure last error before it is overridden. */ DWORD dwResult = (flags & M_ERRNO) != 0 ? GetLastError() : ERROR_SUCCESS; struct openvpnmsica_thread_data *s = (struct openvpnmsica_thread_data *)TlsGetValue(openvpnmsica_thread_data_idx); if (s->hInstall == 0) { /* No MSI session, no fun. */ return; } /* Prepare the message record. The record will contain up to four fields. */ MSIHANDLE hRecordProg = MsiCreateRecord(4); { /* Field 2: The message string. */ char szBufStack[128]; int iResultLen = vsnprintf(szBufStack, _countof(szBufStack), format, arglist); if (iResultLen < _countof(szBufStack)) { /* Use from stack. */ MsiRecordSetStringA(hRecordProg, 2, szBufStack); } else { /* Allocate on heap and retry. */ char *szMessage = (char *)malloc(++iResultLen * sizeof(char)); if (szMessage != NULL) { vsnprintf(szMessage, iResultLen, format, arglist); MsiRecordSetStringA(hRecordProg, 2, szMessage); free(szMessage); } else { /* Use stack variant anyway, but make sure it's zero-terminated. */ szBufStack[_countof(szBufStack) - 1] = 0; MsiRecordSetStringA(hRecordProg, 2, szBufStack); } } } if ((flags & M_ERRNO) == 0) { /* Field 1: MSI Error Code */ MsiRecordSetInteger(hRecordProg, 1, ERROR_MSICA); } else { /* Field 1: MSI Error Code */ MsiRecordSetInteger(hRecordProg, 1, ERROR_MSICA_ERRNO); /* Field 3: The Windows error number. */ MsiRecordSetInteger(hRecordProg, 3, dwResult); /* Field 4: The Windows error description. */ LPTSTR szErrMessage = NULL; if (FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, 0, dwResult, 0, (LPTSTR)&szErrMessage, 0, NULL) && szErrMessage) { /* Trim trailing whitespace. Set terminator after the last non-whitespace character. This prevents excessive trailing line breaks. */ for (size_t i = 0, i_last = 0;; i++) { if (szErrMessage[i]) { if (!_istspace(szErrMessage[i])) { i_last = i + 1; } } else { szErrMessage[i_last] = 0; break; } } MsiRecordSetString(hRecordProg, 4, szErrMessage); LocalFree(szErrMessage); } } MsiProcessMessage(s->hInstall, INSTALLMESSAGE_ERROR, hRecordProg); MsiCloseHandle(hRecordProg); }
MSICA_IMP ReplaceEula(MSIHANDLE hInstall) { // ::DebugBreak(); _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG); _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG); // // EULA File Content is MBCS (RTF) not Unicode AutoProcessHeapPtr<LPSTR> lpEula = pReadEulaFromFileA(hInstall); if (NULL == (LPSTR) lpEula) { _RPT0(_CRT_ERROR, "pReadEulaFromFile failed\n"); return ERROR_INSTALL_FAILURE; } _RPT0(_CRT_WARN, "ReplaceEula\n"); PMSIHANDLE hDatabase = MsiGetActiveDatabase(hInstall); if (0 == hDatabase) { _RPT0(_CRT_ERROR, "MsiGetActiveDatabase failed\n"); return ERROR_INSTALL_FAILURE; } PMSIHANDLE hView; LPCTSTR query = _T("SELECT * FROM `Control` WHERE `Dialog_` = 'LicenseAgreement' AND `Control` = 'Memo'"); UINT msiret = MsiDatabaseOpenView(hDatabase, query, &hView); if (ERROR_SUCCESS != msiret) { _RPT0(_CRT_ERROR, "MsiDatabaseOpenView failed\n"); return ERROR_INSTALL_FAILURE; } msiret = MsiViewExecute(hView, 0); if (ERROR_SUCCESS != msiret) { _RPT0(_CRT_ERROR, "MsiViewExecute failed\n"); return ERROR_INSTALL_FAILURE; } PMSIHANDLE hRecord; msiret = MsiViewFetch(hView, &hRecord); if (ERROR_SUCCESS != msiret) { _RPT0(_CRT_ERROR, "MsiViewFetch failed\n"); return ERROR_INSTALL_FAILURE; } msiret = MsiViewModify(hView, MSIMODIFY_DELETE, hRecord); if (ERROR_SUCCESS != msiret) { _RPT0(_CRT_ERROR, "MsiViewModify failed\n"); return ERROR_INSTALL_FAILURE; } UINT nFields = MsiRecordGetFieldCount(hRecord); AutoProcessHeapPtr<LPTSTR> buffer; DWORD chBuffer = 0; msiret = MsiRecordGetString(hRecord, 10, _T(""), &chBuffer); if (ERROR_MORE_DATA == msiret) { ++chBuffer; buffer = (LPTSTR) ::HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, chBuffer * sizeof(TCHAR)); msiret = MsiRecordGetString(hRecord, 1, buffer, &chBuffer); } msiret = MsiRecordSetStringA(hRecord, 10, lpEula); if (ERROR_SUCCESS != msiret) { _RPT0(_CRT_ERROR, "MsiRecordSetString failed\n"); return ERROR_INSTALL_FAILURE; } msiret = MsiViewModify(hView, MSIMODIFY_INSERT_TEMPORARY, hRecord); if (ERROR_SUCCESS != msiret) { _RPT0(_CRT_ERROR, "MsiViewModify failed\n"); return ERROR_INSTALL_FAILURE; } //msiret = MsiViewExecute(hView, hRecord); //if (ERROR_SUCCESS != msiret) //{ // return ERROR_INSTALL_FAILURE; //} _RPT0(_CRT_WARN, "ReplaceEula completed successfully.\n"); return ERROR_SUCCESS; }
void Record::assign_string( unsigned int field_index, const char *value ) { only_non_null() ; MsiRecordSetStringA( _handle, field_index, value ) ; }
MSICA_IMP ReplaceEula(MSIHANDLE hInstall) { // ::DebugBreak(); _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG); _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG); // // EULA File Content is MBCS (RTF) not Unicode // XTL::AutoProcessHeapPtr<CHAR> lpEula = pReadEulaFromFile(hInstall); if (NULL == (LPSTR) lpEula) { pMsiLogMessage( hInstall, _T("EULACA: ReadEulaFromFile failed, error=0x%X"), GetLastError()); return ERROR_INSTALL_FAILURE; } // // Replacing EULA text control in the database // PMSIHANDLE hDatabase = MsiGetActiveDatabase(hInstall); if (0 == hDatabase) { pMsiLogMessage( hInstall, _T("EULACA: MsiGetActiveDatabase failed, error=0x%X"), GetLastError()); return ERROR_INSTALL_FAILURE; } PMSIHANDLE hView; LPCTSTR query = _T("SELECT * FROM `Control` ") _T(" WHERE `Dialog_` = 'LicenseAgreement' AND `Control` = 'Memo' "); UINT ret = MsiDatabaseOpenView(hDatabase, query, &hView); if (ERROR_SUCCESS != ret) { pMsiLogMessage( hInstall, _T("EULACA: MsiDatabaseOpenView failed, error=0x%X"), ret); return ERROR_INSTALL_FAILURE; } ret = MsiViewExecute(hView, 0); if (ERROR_SUCCESS != ret) { pMsiLogMessage( hInstall, _T("EULACA: MsiViewExecute failed, error=0x%X"), ret); return ERROR_INSTALL_FAILURE; } PMSIHANDLE hRecord; ret = MsiViewFetch(hView, &hRecord); if (ERROR_SUCCESS != ret) { pMsiLogMessage( hInstall, _T("EULACA: MsiViewFetch failed, error=0x%X"), ret); return ERROR_INSTALL_FAILURE; } ret = MsiViewModify(hView, MSIMODIFY_DELETE, hRecord); if (ERROR_SUCCESS != ret) { pMsiLogMessage( hInstall, _T("EULACA: MsiViewModify failed, error=0x%X"), ret); return ERROR_INSTALL_FAILURE; } // // 10th field is the Text column // // Dialog_, Control, Type, X, Y, // Width, Height, Attributes, Property, Text // Control_Next, Help // ret = MsiRecordSetStringA(hRecord, 10, lpEula); if (ERROR_SUCCESS != ret) { pMsiLogMessage( hInstall, _T("EULACA: MsiRecordSetString failed, error=0x%X"), ret); return ERROR_INSTALL_FAILURE; } // // Commit the changes temporarily // ret = MsiViewModify(hView, MSIMODIFY_INSERT_TEMPORARY, hRecord); if (ERROR_SUCCESS != ret) { pMsiLogMessage( hInstall, _T("EULACA: MsiViewModify failed, error=0x%X"), ret); return ERROR_INSTALL_FAILURE; } pMsiLogMessage( hInstall, _T("EULACA: EULA is replaced successfully.")); return ERROR_SUCCESS; }
void Record::AssignString( unsigned int fieldIndex, const char *value ) { OnlyNonNull() ; MsiRecordSetStringA( handle, fieldIndex, value ) ; }
static void test_msirecord(void) { DWORD r, sz; INT i; MSIHANDLE h; char buf[10]; WCHAR bufW[10]; const char str[] = "hello"; const WCHAR strW[] = { 'h','e','l','l','o',0}; char filename[MAX_PATH]; /* check behaviour with an invalid record */ r = MsiRecordGetFieldCount(0); ok(r==-1, "field count for invalid record not -1\n"); SetLastError(0); r = MsiRecordIsNull(0, 0); ok(r==0, "invalid handle not considered to be non-null...\n"); ok(GetLastError()==0, "MsiRecordIsNull set LastError\n"); r = MsiRecordGetInteger(0,0); ok(r == MSI_NULL_INTEGER, "got integer from invalid record\n"); r = MsiRecordSetInteger(0,0,0); ok(r == ERROR_INVALID_HANDLE, "MsiRecordSetInteger returned wrong error\n"); r = MsiRecordSetInteger(0,-1,0); ok(r == ERROR_INVALID_HANDLE, "MsiRecordSetInteger returned wrong error\n"); SetLastError(0); h = MsiCreateRecord(-1); ok(h==0, "created record with -1 elements\n"); h = MsiCreateRecord(0x10000); ok(h==0, "created record with 0x10000 elements\n"); /* doesn't set LastError */ ok(GetLastError()==0, "MsiCreateRecord set last error\n"); r = MsiRecordClearData(0); ok(r == ERROR_INVALID_HANDLE, "MsiRecordClearData returned wrong error\n"); r = MsiRecordDataSize(0,0); ok(r == 0, "MsiRecordDataSize returned wrong error\n"); /* check behaviour of a record with 0 elements */ h = MsiCreateRecord(0); ok(h!=0, "couldn't create record with zero elements\n"); r = MsiRecordGetFieldCount(h); ok(r==0, "field count should be zero\n"); r = MsiRecordIsNull(h,0); ok(r, "new record wasn't null\n"); r = MsiRecordIsNull(h,1); ok(r, "out of range record wasn't null\n"); r = MsiRecordIsNull(h,-1); ok(r, "out of range record wasn't null\n"); r = MsiRecordDataSize(h,0); ok(r==0, "size of null record is 0\n"); sz = sizeof buf; strcpy(buf,"x"); r = MsiRecordGetStringA(h, 0, buf, &sz); ok(r==ERROR_SUCCESS, "failed to get null string\n"); ok(sz==0, "null string too long\n"); ok(buf[0]==0, "null string not set\n"); /* same record, but add an integer to it */ r = MsiRecordSetInteger(h, 0, 0); ok(r == ERROR_SUCCESS, "Failed to set integer at 0 to 0\n"); r = MsiRecordIsNull(h,0); ok(r==0, "new record is null after setting an integer\n"); r = MsiRecordDataSize(h,0); ok(r==sizeof(DWORD), "size of integer record is 4\n"); r = MsiRecordSetInteger(h, 0, 1); ok(r == ERROR_SUCCESS, "Failed to set integer at 0 to 1\n"); r = MsiRecordSetInteger(h, 1, 1); ok(r == ERROR_INVALID_PARAMETER, "set integer at 1\n"); r = MsiRecordSetInteger(h, -1, 0); ok(r == ERROR_INVALID_PARAMETER, "set integer at -1\n"); r = MsiRecordIsNull(h,0); ok(r==0, "new record is null after setting an integer\n"); r = MsiRecordGetInteger(h, 0); ok(r == 1, "failed to get integer\n"); /* same record, but add a null or empty string to it */ r = MsiRecordSetStringA(h, 0, NULL); ok(r == ERROR_SUCCESS, "Failed to set null string at 0\n"); r = MsiRecordIsNull(h, 0); ok(r == TRUE, "null string not null field\n"); r = MsiRecordDataSize(h, 0); ok(r == 0, "size of string record is strlen\n"); buf[0] = 0; sz = sizeof buf; r = MsiRecordGetStringA(h, 0, buf, &sz); ok(r == ERROR_SUCCESS, "Failed to get string at 0\n"); ok(buf[0] == 0, "MsiRecordGetStringA returned the wrong string\n"); ok(sz == 0, "MsiRecordGetStringA returned the wrong length\n"); bufW[0] = 0; sz = sizeof bufW / sizeof bufW[0]; r = MsiRecordGetStringW(h, 0, bufW, &sz); ok(r == ERROR_SUCCESS, "Failed to get string at 0\n"); ok(bufW[0] == 0, "MsiRecordGetStringW returned the wrong string\n"); ok(sz == 0, "MsiRecordGetStringW returned the wrong length\n"); r = MsiRecordSetStringA(h, 0, ""); ok(r == ERROR_SUCCESS, "Failed to set empty string at 0\n"); r = MsiRecordIsNull(h, 0); ok(r == TRUE, "null string not null field\n"); r = MsiRecordDataSize(h, 0); ok(r == 0, "size of string record is strlen\n"); buf[0] = 0; sz = sizeof buf; r = MsiRecordGetStringA(h, 0, buf, &sz); ok(r == ERROR_SUCCESS, "Failed to get string at 0\n"); ok(buf[0] == 0, "MsiRecordGetStringA returned the wrong string\n"); ok(sz == 0, "MsiRecordGetStringA returned the wrong length\n"); bufW[0] = 0; sz = sizeof bufW / sizeof bufW[0]; r = MsiRecordGetStringW(h, 0, bufW, &sz); ok(r == ERROR_SUCCESS, "Failed to get string at 0\n"); ok(bufW[0] == 0, "MsiRecordGetStringW returned the wrong string\n"); ok(sz == 0, "MsiRecordGetStringW returned the wrong length\n"); /* same record, but add a string to it */ r = MsiRecordSetStringA(h,0,str); ok(r == ERROR_SUCCESS, "Failed to set string at 0\n"); r = MsiRecordGetInteger(h, 0); ok(r == MSI_NULL_INTEGER, "should get invalid integer\n"); r = MsiRecordDataSize(h,0); ok(r==sizeof str-1, "size of string record is strlen\n"); buf[0]=0; sz = sizeof buf; r = MsiRecordGetStringA(h,0,buf,&sz); ok(r == ERROR_SUCCESS, "Failed to get string at 0\n"); ok(0==strcmp(buf,str), "MsiRecordGetStringA returned the wrong string\n"); ok(sz == sizeof str-1, "MsiRecordGetStringA returned the wrong length\n"); buf[0]=0; sz = sizeof str - 2; r = MsiRecordGetStringA(h,0,buf,&sz); ok(r == ERROR_MORE_DATA, "small buffer should yield ERROR_MORE_DATA\n"); ok(sz == sizeof str-1, "MsiRecordGetStringA returned the wrong length\n"); ok(0==strncmp(buf,str,sizeof str-3), "MsiRecordGetStringA returned the wrong string\n"); ok(buf[sizeof str - 3]==0, "string wasn't nul terminated\n"); buf[0]=0; sz = sizeof str; r = MsiRecordGetStringA(h,0,buf,&sz); ok(r == ERROR_SUCCESS, "wrong error\n"); ok(sz == sizeof str-1, "MsiRecordGetStringA returned the wrong length\n"); ok(0==strcmp(buf,str), "MsiRecordGetStringA returned the wrong string\n"); memset(bufW, 0, sizeof bufW); sz = 5; r = MsiRecordGetStringW(h,0,bufW,&sz); ok(r == ERROR_MORE_DATA, "wrong error\n"); ok(sz == 5, "MsiRecordGetStringA returned the wrong length\n"); ok(0==memcmp(bufW,strW,8), "MsiRecordGetStringA returned the wrong string\n"); sz = 0; bufW[0] = 'x'; r = MsiRecordGetStringW(h,0,bufW,&sz); ok(r == ERROR_MORE_DATA, "wrong error\n"); ok(sz == 5, "MsiRecordGetStringA returned the wrong length\n"); ok('x'==bufW[0], "MsiRecordGetStringA returned the wrong string\n"); memset(buf, 0, sizeof buf); sz = 5; r = MsiRecordGetStringA(h,0,buf,&sz); ok(r == ERROR_MORE_DATA, "wrong error\n"); ok(sz == 5, "MsiRecordGetStringA returned the wrong length\n"); ok(0==memcmp(buf,str,4), "MsiRecordGetStringA returned the wrong string\n"); sz = 0; buf[0] = 'x'; r = MsiRecordGetStringA(h,0,buf,&sz); ok(r == ERROR_MORE_DATA, "wrong error\n"); ok(sz == 5, "MsiRecordGetStringA returned the wrong length\n"); ok('x'==buf[0], "MsiRecordGetStringA returned the wrong string\n"); /* same record, check we can wipe all the data */ r = MsiRecordClearData(h); ok(r == ERROR_SUCCESS, "Failed to clear record\n"); r = MsiRecordClearData(h); ok(r == ERROR_SUCCESS, "Failed to clear record again\n"); r = MsiRecordIsNull(h,0); ok(r, "cleared record wasn't null\n"); /* same record, try converting strings to integers */ i = MsiRecordSetStringA(h,0,"42"); ok(i == ERROR_SUCCESS, "Failed to set string at 0\n"); i = MsiRecordGetInteger(h, 0); ok(i == 42, "should get invalid integer\n"); i = MsiRecordSetStringA(h,0,"-42"); ok(i == ERROR_SUCCESS, "Failed to set string at 0\n"); i = MsiRecordGetInteger(h, 0); ok(i == -42, "should get invalid integer\n"); i = MsiRecordSetStringA(h,0," 42"); ok(i == ERROR_SUCCESS, "Failed to set string at 0\n"); i = MsiRecordGetInteger(h, 0); ok(i == MSI_NULL_INTEGER, "should get invalid integer\n"); i = MsiRecordSetStringA(h,0,"42 "); ok(i == ERROR_SUCCESS, "Failed to set string at 0\n"); i = MsiRecordGetInteger(h, 0); ok(i == MSI_NULL_INTEGER, "should get invalid integer\n"); i = MsiRecordSetStringA(h,0,"42.0"); ok(i == ERROR_SUCCESS, "Failed to set string at 0\n"); i = MsiRecordGetInteger(h, 0); ok(i == MSI_NULL_INTEGER, "should get invalid integer\n"); i = MsiRecordSetStringA(h,0,"0x42"); ok(i == ERROR_SUCCESS, "Failed to set string at 0\n"); i = MsiRecordGetInteger(h, 0); ok(i == MSI_NULL_INTEGER, "should get invalid integer\n"); i = MsiRecordSetStringA(h,0,"1000000000000000"); ok(i == ERROR_SUCCESS, "Failed to set string at 0\n"); i = MsiRecordGetInteger(h, 0); ok(i == -1530494976, "should get truncated integer\n"); i = MsiRecordSetStringA(h,0,"2147483647"); ok(i == ERROR_SUCCESS, "Failed to set string at 0\n"); i = MsiRecordGetInteger(h, 0); ok(i == 2147483647, "should get maxint\n"); i = MsiRecordSetStringA(h,0,"-2147483647"); ok(i == ERROR_SUCCESS, "Failed to set string at 0\n"); i = MsiRecordGetInteger(h, 0); ok(i == -2147483647, "should get -maxint-1\n"); i = MsiRecordSetStringA(h,0,"4294967297"); ok(i == ERROR_SUCCESS, "Failed to set string at 0\n"); i = MsiRecordGetInteger(h, 0); ok(i == 1, "should get one\n"); i = MsiRecordSetStringA(h,0,"foo"); ok(i == ERROR_SUCCESS, "Failed to set string at 0\n"); i = MsiRecordGetInteger(h, 0); ok(i == MSI_NULL_INTEGER, "should get zero\n"); i = MsiRecordSetStringA(h,0,""); ok(i == ERROR_SUCCESS, "Failed to set string at 0\n"); i = MsiRecordGetInteger(h, 0); ok(i == MSI_NULL_INTEGER, "should get zero\n"); i = MsiRecordSetStringA(h,0,"+1"); ok(i == ERROR_SUCCESS, "Failed to set string at 0\n"); i = MsiRecordGetInteger(h, 0); ok(i == MSI_NULL_INTEGER, "should get zero\n"); /* same record, try converting integers to strings */ r = MsiRecordSetInteger(h, 0, 32); ok(r == ERROR_SUCCESS, "Failed to set integer at 0 to 32\n"); sz = 1; r = MsiRecordGetStringA(h, 0, NULL, &sz); ok(r == ERROR_SUCCESS, "failed to get string from integer\n"); ok(sz == 2, "length wrong\n"); buf[0]=0; sz = sizeof buf; r = MsiRecordGetStringA(h, 0, buf, &sz); ok(r == ERROR_SUCCESS, "failed to get string from integer\n"); ok(0==strcmp(buf,"32"), "failed to get string from integer\n"); r = MsiRecordSetInteger(h, 0, -32); ok(r == ERROR_SUCCESS, "Failed to set integer at 0 to 32\n"); buf[0]=0; sz = 1; r = MsiRecordGetStringA(h, 0, NULL, &sz); ok(r == ERROR_SUCCESS, "failed to get string from integer\n"); ok(sz == 3, "length wrong\n"); sz = sizeof buf; r = MsiRecordGetStringA(h, 0, buf, &sz); ok(r == ERROR_SUCCESS, "failed to get string from integer\n"); ok(0==strcmp(buf,"-32"), "failed to get string from integer\n"); buf[0]=0; /* same record, now try streams */ r = MsiRecordSetStreamA(h, 0, NULL); ok(r == ERROR_INVALID_PARAMETER, "set NULL stream\n"); sz = sizeof buf; r = MsiRecordReadStream(h, 0, buf, &sz); ok(r == ERROR_INVALID_DATATYPE, "read non-stream type\n"); ok(sz == sizeof buf, "set sz\n"); r = MsiRecordDataSize( h, -1); ok(r == 0,"MsiRecordDataSize returned wrong size\n"); r = MsiRecordDataSize( h, 0); ok(r == 4,"MsiRecordDataSize returned wrong size\n"); /* same record, now close it */ r = MsiCloseHandle(h); ok(r == ERROR_SUCCESS, "Failed to close handle\n"); /* now try streams in a new record - need to create a file to play with */ r = create_temp_file(filename); if(!r) return; /* streams can't be inserted in field 0 for some reason */ h = MsiCreateRecord(2); ok(h, "couldn't create a two field record\n"); r = MsiRecordSetStreamA(h, 0, filename); ok(r == ERROR_INVALID_PARAMETER, "added stream to field 0\n"); r = MsiRecordSetStreamA(h, 1, filename); ok(r == ERROR_SUCCESS, "failed to add stream to record\n"); r = MsiRecordReadStream(h, 1, buf, NULL); ok(r == ERROR_INVALID_PARAMETER, "should return error\n"); DeleteFileA(filename); /* Windows 98 doesn't like this at all, so don't check return. */ r = MsiRecordReadStream(h, 1, NULL, NULL); ok(r == ERROR_INVALID_PARAMETER, "should return error\n"); sz = sizeof buf; r = MsiRecordReadStream(h, 1, NULL, &sz); ok(r == ERROR_SUCCESS, "failed to read stream\n"); ok(sz==26,"couldn't get size of stream\n"); sz = 0; r = MsiRecordReadStream(h, 1, buf, &sz); ok(r == ERROR_SUCCESS, "failed to read stream\n"); ok(sz==0,"short read\n"); sz = sizeof buf; r = MsiRecordReadStream(h, 1, buf, &sz); ok(r == ERROR_SUCCESS, "failed to read stream\n"); ok(sz==sizeof buf,"short read\n"); ok(!strncmp(buf,"abcdefghij",10), "read the wrong thing\n"); sz = sizeof buf; r = MsiRecordReadStream(h, 1, buf, &sz); ok(r == ERROR_SUCCESS, "failed to read stream\n"); ok(sz==sizeof buf,"short read\n"); ok(!strncmp(buf,"klmnopqrst",10), "read the wrong thing\n"); memset(buf,0,sizeof buf); sz = sizeof buf; r = MsiRecordReadStream(h, 1, buf, &sz); ok(r == ERROR_SUCCESS, "failed to read stream\n"); ok(sz==6,"short read\n"); ok(!strcmp(buf,"uvwxyz"), "read the wrong thing\n"); memset(buf,0,sizeof buf); sz = sizeof buf; r = MsiRecordReadStream(h, 1, buf, &sz); ok(r == ERROR_SUCCESS, "failed to read stream\n"); ok(sz==0,"size non-zero at end of stream\n"); ok(buf[0]==0, "read something at end of the stream\n"); r = MsiRecordSetStreamA(h, 1, NULL); ok(r == ERROR_SUCCESS, "failed to reset stream\n"); sz = 0; r = MsiRecordReadStream(h, 1, NULL, &sz); ok(r == ERROR_SUCCESS, "bytes left wrong after reset\n"); ok(sz==26,"couldn't get size of stream\n"); r = MsiRecordDataSize(h,1); ok(r == 26,"MsiRecordDataSize returned wrong size\n"); /* now close the stream record */ r = MsiCloseHandle(h); ok(r == ERROR_SUCCESS, "Failed to close handle\n"); DeleteFileA(filename); /* Delete it for sure, when everything else is closed. */ }
static void test_fieldzero(void) { MSIHANDLE hdb, hview, rec; CHAR buf[MAX_PATH]; LPCSTR query; DWORD sz; UINT r; rec = MsiCreateRecord(1); ok(rec != 0, "Expected a valid handle\n"); r = MsiRecordGetInteger(rec, 0); ok(r == MSI_NULL_INTEGER, "Expected MSI_NULL_INTEGER, got %d\n", r); sz = MAX_PATH; lstrcpyA(buf, "apple"); r = MsiRecordGetStringA(rec, 0, buf, &sz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf); ok(sz == 0, "Expectd 0, got %d\n", sz); r = MsiRecordIsNull(rec, 0); ok(r == TRUE, "Expected TRUE, got %d\n", r); r = MsiRecordGetInteger(rec, 1); ok(r == MSI_NULL_INTEGER, "Expected MSI_NULL_INTEGER, got %d\n", r); r = MsiRecordSetInteger(rec, 1, 42); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); r = MsiRecordGetInteger(rec, 0); ok(r == MSI_NULL_INTEGER, "Expected MSI_NULL_INTEGER, got %d\n", r); sz = MAX_PATH; lstrcpyA(buf, "apple"); r = MsiRecordGetStringA(rec, 0, buf, &sz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf); ok(sz == 0, "Expectd 0, got %d\n", sz); r = MsiRecordIsNull(rec, 0); ok(r == TRUE, "Expected TRUE, got %d\n", r); r = MsiRecordGetInteger(rec, 1); ok(r == 42, "Expected 42, got %d\n", r); r = MsiRecordSetStringA(rec, 1, "bologna"); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); r = MsiRecordGetInteger(rec, 0); ok(r == MSI_NULL_INTEGER, "Expected MSI_NULL_INTEGER, got %d\n", r); sz = MAX_PATH; lstrcpyA(buf, "apple"); r = MsiRecordGetStringA(rec, 0, buf, &sz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(buf, ""), "Expected \"\", got \"%s\"\n", buf); ok(sz == 0, "Expectd 0, got %d\n", sz); r = MsiRecordIsNull(rec, 0); ok(r == TRUE, "Expected TRUE, got %d\n", r); sz = MAX_PATH; lstrcpyA(buf, "apple"); r = MsiRecordGetStringA(rec, 1, buf, &sz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(buf, "bologna"), "Expected \"bologna\", got \"%s\"\n", buf); ok(sz == 7, "Expectd 7, got %d\n", sz); MsiCloseHandle(rec); r = MsiOpenDatabaseW(msifileW, MSIDBOPEN_CREATE, &hdb); ok(r == ERROR_SUCCESS, "MsiOpenDatabase failed\n"); query = "CREATE TABLE `drone` ( " "`id` INT, `name` CHAR(32), `number` CHAR(32) " "PRIMARY KEY `id`)"; r = MsiDatabaseOpenViewA(hdb, query, &hview); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); r = MsiViewExecute(hview, 0); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); r = MsiViewClose(hview); ok(r == ERROR_SUCCESS, "MsiViewClose failed\n"); r = MsiCloseHandle(hview); ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n"); query = "INSERT INTO `drone` ( `id`, `name`, `number` )" "VALUES('1', 'Abe', '8675309')"; r = MsiDatabaseOpenViewA(hdb, query, &hview); ok(r == ERROR_SUCCESS, "MsiDatabaseOpenView failed\n"); r = MsiViewExecute(hview, 0); ok(r == ERROR_SUCCESS, "MsiViewExecute failed\n"); r = MsiViewClose(hview); ok(r == ERROR_SUCCESS, "MsiViewClose failed\n"); r = MsiCloseHandle(hview); ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n"); r = MsiDatabaseGetPrimaryKeysA(hdb, "drone", &rec); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); r = MsiRecordGetInteger(rec, 0); ok(r == MSI_NULL_INTEGER, "Expected MSI_NULL_INTEGER, got %d\n", r); sz = MAX_PATH; lstrcpyA(buf, "apple"); r = MsiRecordGetStringA(rec, 0, buf, &sz); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); ok(!lstrcmpA(buf, "drone"), "Expected \"drone\", got \"%s\"\n", buf); ok(sz == 5, "Expectd 5, got %d\n", sz); r = MsiRecordIsNull(rec, 0); ok(r == FALSE, "Expected FALSE, got %d\n", r); MsiCloseHandle(rec); r = MsiDatabaseGetPrimaryKeysA(hdb, "nosuchtable", &rec); ok(r == ERROR_INVALID_TABLE, "Expected ERROR_INVALID_TABLE, got %d\n", r); query = "SELECT * FROM `drone` WHERE `id` = 1"; r = MsiDatabaseOpenViewA(hdb, query, &hview); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); r = MsiViewExecute(hview, 0); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); r = MsiViewFetch(hview, &rec); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); r = MsiRecordGetInteger(rec, 0); ok(r != MSI_NULL_INTEGER && r != 0, "Expected non-NULL value, got %d\n", r); r = MsiRecordIsNull(rec, 0); ok(r == FALSE, "Expected FALSE, got %d\n", r); r = MsiCloseHandle(hview); ok(r == ERROR_SUCCESS, "MsiCloseHandle failed\n"); MsiCloseHandle(rec); MsiCloseHandle(hdb); DeleteFileA(msifile); }