protected function loadFlexias(phpMorphy_Dict_Source_Normalized_Ancodes $source, $context, $dictId) { $fields = array('dict_id', 'flexia_model_id', 'form_no', 'suffix', 'prefix', 'ancode_id'); $stmt = $this->engine->prepareInsert('flexias', $fields); $bulk = $this->engine->getBulkInserter('flexias', $fields); $map = $context->getFlexiasMap(); $ancodes_map = $context->getAncodesMap(); $total_flexias = 0; $total_models = 0; $prev_time = microtime(true); foreach ($source->getFlexias() as $flexia_model) { $form_no = 0; $flexia_model_id = 0; // this updated latter foreach ($flexia_model->getFlexias() as $flexia) { if ($total_flexias % self::DUMP_EVERY_FLEXIA == 0) { $time = microtime(true) - $prev_time; $this->log(sprintf("{$total_models}/{$total_flexias} flexias done, %0.2f fps", $total_flexias / $time)); } if ($total_flexias % self::COMMIT_EVERY_FLEXIA == 0) { $this->log("Flush packet of inserts"); $bulk->execute(); } $data = array($dictId, $flexia_model_id, $form_no, $this->trim($flexia->getSuffix(), 32), $this->trim($flexia->getPrefix(), 16), $ancodes_map->resolve($flexia->getAncodeId())); if (!$form_no) { $stmt->execute($data); $flexia_model_id = (int) $this->engine->getLastInsertId('flexias'); // TODO: use separate sequence (emulate in mysql?) $sql = 'UPDATE ' . $this->engine->quoteTableName('flexias') . ' SET flexia_model_id = ' . $flexia_model_id . ' WHERE id = ' . $flexia_model_id; $this->engine->execute($sql, false); } else { $bulk->add($data); } $form_no++; $total_flexias++; } if (!$flexia_model_id) { throw new phpMorphy_Dict_Writer_Sql_Exception("New flexia model without id"); } $map->register($flexia_model->getId(), $flexia_model_id); $total_models++; } $bulk->execute(); }