/* str -- create a string (in garbage collection space) by printing to it */ extern char *str VARARGS1(const char *, fmt) { char *s; va_list args; VA_START(args, fmt); s = strv(fmt, args); va_end(args); return s; }
void StlAdvancedFeaturesExample::char_star_string_storage() { int i; // Varying length data element storage/retrieval cout<<"\nchar*/wchar_t* string storage support...\n"; if (explicit_txn) dbstl::begin_txn(0, penv); // Use Dbt to wrap any object and store them. This is rarely needed, // so this piece of code is only for test purpose. db_vector<DbstlDbt> strv(dbstrv, penv); vector<string> strsv; vector<DbstlDbt> strvdbts; strv.clear(); int strlenmax = 256, strlenmin = 64; string str; DbstlDbt dbt; rand_str_dbt rand_str_maker; dbt.set_flags(DB_DBT_USERMEM); dbt.set_data(DbstlMalloc(strlenmax + 10)); dbt.set_ulen(strlenmax + 10); for (int jj = 0; jj < 10; jj++) { rand_str_maker(dbt, str, strlenmin, strlenmax); strsv.push_back(str); strv.push_back(dbt); } cout<<"\nstrings:\n"; for (i = 0; i < 10; i++) { db_vector<DbstlDbt>::value_type_wrap elemref = strv[i]; strvdbts.push_back(elemref); printf("\n%s\n%s", (char*)(strvdbts[i].get_data()), strsv[i].c_str()); check_expr(strcmp((char*)(elemref.get_data()), strsv[i].c_str()) == 0); check_expr(strcmp((char*)(strvdbts[i].get_data()), strsv[i].c_str()) == 0); } strv.clear(); if (explicit_txn) { dbstl::commit_txn(penv); dbstl::begin_txn(0, penv); } // Use ordinary way to store strings. TCHAR cstr1[32], cstr2[32], cstr3[32]; strcpy(cstr1, "abc"); strcpy(cstr2, "defcd"); strcpy(cstr3, "edggsefcd"); typedef db_map<int, TCHAR*, ElementHolder<TCHAR*> > strmap_t; strmap_t strmap(dmdb6, penv); strmap.clear(); strmap.insert(make_pair(1, cstr1)); strmap.insert(make_pair(2, cstr2)); strmap.insert(make_pair(3, cstr3)); cout<<"\n strings in strmap:\n"; for (strmap_t::const_iterator citr = strmap.begin(); citr != strmap.end(); citr++) cout<<(*citr).second<<'\t'; cout<<strmap[1]<<strmap[2]<<strmap[3]; TCHAR cstr4[32], cstr5[32], cstr6[32]; _tcscpy(cstr4, strmap[1]); _tcscpy(cstr5, strmap[2]); _tcscpy(cstr6, strmap[3]); _tprintf(_T("%s, %s, %s"), cstr4, cstr5, cstr6); strmap_t::value_type_wrap::second_type vts = strmap[1]; using_charstr(vts); vts._DB_STL_StoreElement(); _tcscpy(cstr4, _T("hello world")); vts = cstr4; vts._DB_STL_StoreElement(); cout<<"\n\nstrmap[1]: "<<strmap[1]; check_expr(_tcscmp(strmap[1], cstr4) == 0); vts[0] = _T('H');// it is wrong to do it this way vts._DB_STL_StoreElement(); check_expr(_tcscmp(strmap[1], _T("Hello world")) == 0); TCHAR *strbase = vts._DB_STL_value(); strbase[6] = _T('W'); vts._DB_STL_StoreElement(); check_expr(_tcscmp(strmap[1], _T("Hello World")) == 0); strmap.clear(); typedef db_map<const char *, const char *, ElementHolder<const char *> > cstrpairs_t; cstrpairs_t strpairs(dmdb6, penv); strpairs["abc"] = "def"; strpairs["ghi"] = "jkl"; strpairs["mno"] = "pqrs"; strpairs["tuv"] = "wxyz"; cstrpairs_t::const_iterator ciitr; cstrpairs_t::iterator iitr; for (ciitr = strpairs.begin(), iitr = strpairs.begin(); iitr != strpairs.end(); ++iitr, ++ciitr) { cout<<"\n"<<iitr->first<<"\t"<<iitr->second; cout<<"\n"<<ciitr->first<<"\t"<<ciitr->second; check_expr(strcmp(ciitr->first, iitr->first) == 0 && strcmp(ciitr->second, iitr->second) == 0); } typedef db_map<char *, char *, ElementHolder<char *> > strpairs_t; typedef std::map<string, string> sstrpairs_t; sstrpairs_t sstrpairs2; strpairs_t strpairs2; rand_str_dbt randstr; for (i = 0; i < 100; i++) { string rdstr, rdstr2; randstr(dbt, rdstr); randstr(dbt, rdstr2); strpairs2[(char *)rdstr.c_str()] = (char *)rdstr2.c_str(); sstrpairs2[rdstr] = rdstr2; } strpairs_t::iterator itr; strpairs_t::const_iterator citr; for (itr = strpairs2.begin(); itr != strpairs2.end(); ++itr) { check_expr(strcmp(strpairs2[itr->first], itr->second) == 0); check_expr(string(itr->second) == sstrpairs2[string(itr->first)]); strpairs_t::value_type_wrap::second_type&secref = itr->second; std::reverse((char *)secref, (char *)secref + strlen(secref)); secref._DB_STL_StoreElement(); std::reverse(sstrpairs2[itr->first].begin(), sstrpairs2[itr->first].end()); } check_expr(strpairs2.size() == sstrpairs2.size()); for (citr = strpairs2.begin( ReadModifyWriteOption::no_read_modify_write(), true, BulkRetrievalOption::bulk_retrieval()); citr != strpairs2.end(); ++citr) { check_expr(strcmp(strpairs2[citr->first], citr->second) == 0); check_expr(string(citr->second) == sstrpairs2[string(citr->first)]); } if (explicit_txn) dbstl::commit_txn(penv); db_vector<const char *, ElementHolder<const char *> > csvct(10); vector<const char *> scsvct(10); const char *pconststr = "abc"; for (i = 0; i < 10; i++) { scsvct[i] = pconststr; csvct[i] = pconststr; csvct[i] = scsvct[i]; // scsvct[i] = csvct[i]; assignment won't work because scsvct // only stores pointer but do not copy the sequence, thus it // will refer to an invalid pointer when i changes. } for (i = 0; i < 10; i++) { check_expr(strcmp(csvct[i], scsvct[i]) == 0); cout<<endl<<(const char *)(csvct[i]); } db_vector<const wchar_t *, ElementHolder<const wchar_t *> > wcsvct(10); vector<const wchar_t *> wscsvct(10); const wchar_t *pconstwstr = L"abc"; for (i = 0; i < 10; i++) { wscsvct[i] = pconstwstr; wcsvct[i] = pconstwstr; wcsvct[i] = wscsvct[i]; // scsvct[i] = csvct[i]; assignment won't work because scsvct // only stores pointer but do not copy the sequence, thus it // will refer to an invalid pointer when i changes. } for (i = 0; i < 10; i++) { check_expr(wcscmp(wcsvct[i], wscsvct[i]) == 0); } } // char_star_string_storage