void be_structure::put_core_fields ( ostream & os, be_Tab & tab, const DDS_StdString & sptr, FieldList & coreFields, unsigned long uid ) { DDS::Boolean wroteOne = FALSE; DDS_StdString uids = BE_Globals::ulong_to_string(uid); DDS_StdString _in_ = (DDS_StdString)"_in_" + uids; FieldList::iterator it; // first, let's declare the core args for putting for (it = coreFields.begin(); it != coreFields.end(); it++) { (*it)->declare_for_struct_put (os, tab, sptr, uid); } // // now, let's initilize our put args // os << tab << "DDS::Codec::Param " << _in_ << "[" << coreFields.size() << "] =" << nl; os << tab << "{" << nl; tab.indent (); for (it = coreFields.begin(); it != coreFields.end(); it++) { if (wroteOne) { os << "," << nl; } (*it)->make_put_param (os, tab, sptr, uid); wroteOne = TRUE; } tab.outdent (); os << nl << tab << "};" << nl; // and finally, let's put 'em os << tab << "os.put (" << _in_ << ", " << coreFields.size () << XBE_Ev::arg (XBE_ENV_VARN) << ");" << nl; }
void del_fields_in_table(doid_t id, const Class* dcc, const FieldList &fields) { string name; for(auto it = fields.begin(); it != fields.end(); ++it) { const Field* field = *it; if(field->has_keyword("db")) { m_sql << "UPDATE fields_" << dcc->get_name() << " SET " << field->get_name() << "=NULL WHERE object_id=" << id << ";"; } } }
void get_fields_from_table(doid_t id, const Class* dcc, const FieldList &fields, FieldValues &values) { string value; indicator ind; for(auto it = fields.begin(); it != fields.end(); ++it) { const Field* field = *it; if(field->has_keyword("db")) { m_sql << "SELECT " << field->get_name() << " FROM fields_" << dcc->get_name() << " WHERE object_id=" << id << ";", into(value, ind); if(ind == i_ok) { bool parse_err; string packed_data = parse_value(field->get_type(), value, parse_err); if(parse_err) { m_log->error() << "Failed parsing value for field '" << field->get_name() << "' of object " << id << "' from database.\n"; continue; } values[field] = vector<uint8_t>(packed_data.begin(), packed_data.end()); } } } }
bool DatabaseUtils::GetDatabaseResults(const MediaType &mediaType, const FieldList &fields, const std::unique_ptr<dbiplus::Dataset> &dataset, DatabaseResults &results) { if (dataset->num_rows() == 0) return true; const dbiplus::result_set &resultSet = dataset->get_result_set(); unsigned int offset = results.size(); if (fields.empty()) { DatabaseResult result; for (unsigned int index = 0; index < resultSet.records.size(); index++) { result[FieldRow] = index + offset; results.push_back(result); } return true; } if (resultSet.record_header.size() < fields.size()) return false; std::vector<int> fieldIndexLookup; fieldIndexLookup.reserve(fields.size()); for (FieldList::const_iterator it = fields.begin(); it != fields.end(); ++it) fieldIndexLookup.push_back(GetFieldIndex(*it, mediaType)); results.reserve(resultSet.records.size() + offset); for (unsigned int index = 0; index < resultSet.records.size(); index++) { DatabaseResult result; result[FieldRow] = index + offset; unsigned int lookupIndex = 0; for (FieldList::const_iterator it = fields.begin(); it != fields.end(); ++it) { int fieldIndex = fieldIndexLookup[lookupIndex++]; if (fieldIndex < 0) return false; std::pair<Field, CVariant> value; value.first = *it; if (!GetFieldValue(resultSet.records[index]->at(fieldIndex), value.second)) CLog::Log(LOGWARNING, "GetDatabaseResults: unable to retrieve value of field %s", resultSet.record_header[fieldIndex].name.c_str()); if (value.first == FieldYear && (mediaType == MediaTypeTvShow || mediaType == MediaTypeEpisode)) { CDateTime dateTime; dateTime.SetFromDBDate(value.second.asString()); if (dateTime.IsValid()) { value.second.clear(); value.second = dateTime.GetYear(); } } result.insert(value); } result[FieldMediaType] = mediaType; if (mediaType == MediaTypeMovie || mediaType == MediaTypeVideoCollection || mediaType == MediaTypeTvShow || mediaType == MediaTypeMusicVideo) result[FieldLabel] = result.at(FieldTitle).asString(); else if (mediaType == MediaTypeEpisode) { std::ostringstream label; label << (int)(result.at(FieldSeason).asInteger() * 100 + result.at(FieldEpisodeNumber).asInteger()); label << ". "; label << result.at(FieldTitle).asString(); result[FieldLabel] = label.str(); } else if (mediaType == MediaTypeAlbum) result[FieldLabel] = result.at(FieldAlbum).asString(); else if (mediaType == MediaTypeSong) { std::ostringstream label; label << (int)result.at(FieldTrackNumber).asInteger(); label << ". "; label << result.at(FieldTitle).asString(); result[FieldLabel] = label.str(); } else if (mediaType == MediaTypeArtist) result[FieldLabel] = result.at(FieldArtist).asString(); results.push_back(result); } return true; }