RingoFetchContext::RingoFetchContext (int id_, RingoOracleContext &context, const Array<char> &query_id) : substructure(context.context()), exact(context.context()), _context(context) { id = id_; context_id = context.context().id; _query_id.copy(query_id); fresh = false; fetch_engine = 0; shadow_fetch.reset(new RingoShadowFetch(*this)); fast_index.reset(new RingoFastIndex(*this)); }
bool _ringoRegisterReaction (OracleEnv &env, const char *rowid, const Array<char> &reaction_buf, RingoOracleContext &context, RingoIndex &index, BingoFingerprints &fingerprints) { QS_DEF(Array<char>, data); QS_DEF(Array<char>, compressed_rowid); ArrayOutput output(data); output.writeChar(0); // 0 -- present, 1 -- removed from index ArrayOutput rid_output(compressed_rowid); RowIDSaver rid_saver(context.context().rid_dict, rid_output); rid_saver.saveRowID(rowid); output.writeByte((byte)compressed_rowid.size()); output.writeArray(compressed_rowid); TRY_READ_TARGET_RXN { BufferScanner scanner(reaction_buf); try { index.prepare(scanner, output, NULL); } catch (CmfSaver::Error &e) { if (context.context().reject_invalid_structures) throw; // Rethrow this exception further env.dbgPrintf(bad_reaction_warning_rowid, rowid, e.message()); return false; } catch (CrfSaver::Error &e) { if (context.context().reject_invalid_structures) throw; // Rethrow this exception further env.dbgPrintf(bad_reaction_warning_rowid, rowid, e.message()); return false; } } CATCH_READ_TARGET_RXN_ROWID(rowid, { if (context.context().reject_invalid_structures) throw; // Rethrow this exception further return false; });
bool _ringoRegisterReaction (OracleEnv &env, const char *rowid, const Array<char> &reaction_buf, RingoOracleContext &context, RingoIndex &index, BingoFingerprints &fingerprints) { QS_DEF(Array<char>, data); QS_DEF(Array<char>, compressed_rowid); ArrayOutput output(data); output.writeChar(0); // 0 -- present, 1 -- removed from index ArrayOutput rid_output(compressed_rowid); RowIDSaver rid_saver(context.context().rid_dict, rid_output); rid_saver.saveRowID(rowid); output.writeByte((byte)compressed_rowid.size()); output.writeArray(compressed_rowid); TRY_READ_TARGET_RXN { BufferScanner scanner(reaction_buf); try { index.prepare(scanner, output, NULL); } catch (CmfSaver::Error &e) { env.dbgPrintf(bad_reaction_warning_rowid, rowid, e.message()); return false;} catch (CrfSaver::Error &e) { env.dbgPrintf(bad_reaction_warning_rowid, rowid, e.message()); return false;} } CATCH_READ_TARGET_RXN_ROWID(rowid, return false); // some magic: round it up to avoid ora-22282 if (data.size() % 2 == 1) output.writeChar(0); int blockno, offset; context.context().storage.add(env, data, blockno, offset); fingerprints.addFingerprint(env, index.getFingerprint()); context.shadow_table.addReaction(env, index, rowid, blockno + 1, offset); return true; }
void ringoRegisterTable (OracleEnv &env, RingoOracleContext &context, const char *source_table, const char *source_column, const char *target_datatype) { QS_DEF(Array<char>, reaction_buf); OracleStatement statement(env); AutoPtr<OracleLOB> reaction_lob; OraRowidText rowid; char varchar2_text[4001]; // Oracle's BLOB and CLOB types always come uppercase bool blob = (strcmp(target_datatype, "BLOB") == 0); bool clob = (strcmp(target_datatype, "CLOB") == 0); int total_count = 0; OracleStatement::executeSingleInt(total_count, env, "SELECT COUNT(*) FROM %s WHERE %s IS NOT NULL AND LENGTH(%s) > 0", source_table, source_column, source_column); context.context().longOpInit(env, total_count, "Building reaction index", source_table, "reactions"); statement.append("SELECT %s, RowidToChar(rowid) FROM %s WHERE %s IS NOT NULL AND LENGTH(%s) > 0", source_column, source_table, source_column, source_column); statement.prepare(); if (blob) { reaction_lob.reset(new OracleLOB(env)); statement.defineBlobByPos(1, reaction_lob.ref()); } else if (clob) { reaction_lob.reset(new OracleLOB(env)); statement.defineClobByPos(1, reaction_lob.ref()); } else statement.defineStringByPos(1, varchar2_text, sizeof(varchar2_text)); statement.defineStringByPos(2, rowid.ptr(), sizeof(rowid)); BingoFingerprints &fingerprints = context.fingerprints; int nthreads = 0; fingerprints.validateForUpdate(env); context.context().configGetInt(env, "NTHREADS", nthreads); nthreads = 1; //if (nthreads == 1) { int n = 0; QS_DEF(RingoIndex, index); index.init(context.context()); if (statement.executeAllowNoData()) do { env.dbgPrintf("inserting reaction #%d with rowid %s\n", n, rowid.ptr()); if (blob || clob) reaction_lob->readAll(reaction_buf, false); else reaction_buf.readString(varchar2_text, false); try { if (_ringoRegisterReaction(env, rowid.ptr(), reaction_buf, context, index, fingerprints)) n++; } catch (Exception &ex) { char buf[4096]; snprintf(buf, NELEM(buf), "Failed on record with rowid=%s. Error message is '%s'", rowid.ptr(), ex.message()); throw Exception(buf); } if ((n % 50) == 0) context.context().longOpUpdate(env, n); if ((n % 1000) == 0) { env.dbgPrintfTS("done %d reactions ; flushing\n", n); context.context().storage.flush(env); } } while (statement.fetch()); fingerprints.flush(env); } }