| 133 | } |
| 134 | |
| 135 | void ODBCDescriptor::SetField(SQLSMALLINT record_number, SQLSMALLINT field_identifier, |
| 136 | SQLPOINTER value, SQLINTEGER buffer_length) { |
| 137 | if (!is_writable_) { |
| 138 | throw DriverException("Cannot modify read-only descriptor", "HY016"); |
| 139 | } |
| 140 | |
| 141 | // Handle header fields before validating the record number. |
| 142 | switch (field_identifier) { |
| 143 | case SQL_DESC_ALLOC_TYPE: |
| 144 | case SQL_DESC_ARRAY_SIZE: |
| 145 | case SQL_DESC_ARRAY_STATUS_PTR: |
| 146 | case SQL_DESC_BIND_OFFSET_PTR: |
| 147 | case SQL_DESC_BIND_TYPE: |
| 148 | case SQL_DESC_ROWS_PROCESSED_PTR: |
| 149 | case SQL_DESC_COUNT: |
| 150 | SetHeaderField(field_identifier, value, buffer_length); |
| 151 | return; |
| 152 | default: |
| 153 | break; |
| 154 | } |
| 155 | |
| 156 | if (record_number == 0) { |
| 157 | throw DriverException("Bookmarks are unsupported.", "07009"); |
| 158 | } |
| 159 | |
| 160 | if (static_cast<size_t>(record_number) > records_.size()) { |
| 161 | throw DriverException("Invalid descriptor index", "HY009"); |
| 162 | } |
| 163 | |
| 164 | SQLSMALLINT zero_based_record = record_number - 1; |
| 165 | DescriptorRecord& record = records_[zero_based_record]; |
| 166 | switch (field_identifier) { |
| 167 | case SQL_DESC_AUTO_UNIQUE_VALUE: |
| 168 | case SQL_DESC_BASE_COLUMN_NAME: |
| 169 | case SQL_DESC_BASE_TABLE_NAME: |
| 170 | case SQL_DESC_CASE_SENSITIVE: |
| 171 | case SQL_DESC_CATALOG_NAME: |
| 172 | case SQL_DESC_DISPLAY_SIZE: |
| 173 | case SQL_DESC_FIXED_PREC_SCALE: |
| 174 | case SQL_DESC_LABEL: |
| 175 | case SQL_DESC_LITERAL_PREFIX: |
| 176 | case SQL_DESC_LITERAL_SUFFIX: |
| 177 | case SQL_DESC_LOCAL_TYPE_NAME: |
| 178 | case SQL_DESC_NULLABLE: |
| 179 | case SQL_DESC_NUM_PREC_RADIX: |
| 180 | case SQL_DESC_ROWVER: |
| 181 | case SQL_DESC_SCHEMA_NAME: |
| 182 | case SQL_DESC_SEARCHABLE: |
| 183 | case SQL_DESC_TABLE_NAME: |
| 184 | case SQL_DESC_TYPE_NAME: |
| 185 | case SQL_DESC_UNNAMED: |
| 186 | case SQL_DESC_UNSIGNED: |
| 187 | case SQL_DESC_UPDATABLE: |
| 188 | throw DriverException("Cannot modify read-only field.", "HY092"); |
| 189 | case SQL_DESC_CONCISE_TYPE: |
| 190 | SetAttribute(value, record.concise_type); |
| 191 | record.is_bound = false; |
| 192 | has_bindings_changed_ = true; |