document.write("<div class=\"pastie\">\n");
document.write("  <link href=\"http://pastie.org/stylesheets/embed.css\" media=\"screen\" rel=\"stylesheet\" type=\"text/css\" />\n");
document.write("  <link href=\"http://pastie.org/stylesheets/clean.css\" media=\"screen\" rel=\"stylesheet\" type=\"text/css\" />\n");
document.write("  \n");
document.write("\n");
document.write("  \n");
document.write("  \n");
document.write("\n");
document.write("\n");
document.write("\n");
document.write("\n");
document.write("\n");
document.write("\n");
document.write("\n");
document.write("	\n");
document.write("	<div class=\"allcode\">\n");
document.write("		<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\">\n");
document.write("		<tr>\n");
document.write("			<td>\n");
document.write("				\n");
document.write("				<pre class=\"textmate-source-numbers\">1\n");
document.write("2\n");
document.write("3\n");
document.write("4\n");
document.write("5\n");
document.write("6\n");
document.write("7\n");
document.write("8\n");
document.write("9\n");
document.write("10\n");
document.write("11\n");
document.write("12\n");
document.write("13\n");
document.write("14\n");
document.write("15\n");
document.write("16\n");
document.write("17\n");
document.write("18\n");
document.write("19\n");
document.write("20\n");
document.write("21\n");
document.write("22\n");
document.write("23\n");
document.write("24\n");
document.write("25\n");
document.write("26\n");
document.write("27\n");
document.write("28\n");
document.write("29\n");
document.write("30\n");
document.write("31\n");
document.write("32\n");
document.write("33\n");
document.write("34\n");
document.write("35\n");
document.write("36\n");
document.write("37\n");
document.write("38\n");
document.write("39\n");
document.write("40\n");
document.write("41\n");
document.write("42\n");
document.write("43\n");
document.write("44\n");
document.write("45\n");
document.write("46\n");
document.write("47\n");
document.write("48\n");
document.write("49\n");
document.write("50\n");
document.write("51\n");
document.write("52\n");
document.write("53\n");
document.write("54\n");
document.write("55\n");
document.write("56\n");
document.write("57\n");
document.write("58\n");
document.write("59\n");
document.write("60\n");
document.write("61\n");
document.write("62\n");
document.write("63\n");
document.write("64\n");
document.write("65\n");
document.write("66\n");
document.write("67\n");
document.write("68\n");
document.write("69\n");
document.write("70\n");
document.write("71\n");
document.write("72\n");
document.write("73\n");
document.write("74\n");
document.write("75\n");
document.write("76\n");
document.write("77\n");
document.write("78\n");
document.write("79\n");
document.write("80\n");
document.write("81\n");
document.write("82\n");
document.write("83\n");
document.write("84\n");
document.write("85\n");
document.write("86\n");
document.write("87\n");
document.write("88\n");
document.write("89\n");
document.write("90\n");
document.write("91\n");
document.write("92\n");
document.write("93\n");
document.write("94\n");
document.write("95\n");
document.write("96\n");
document.write("97\n");
document.write("98\n");
document.write("99\n");
document.write("100\n");
document.write("101\n");
document.write("102\n");
document.write("103\n");
document.write("104\n");
document.write("105\n");
document.write("106\n");
document.write("107\n");
document.write("108\n");
document.write("109\n");
document.write("110\n");
document.write("111\n");
document.write("112\n");
document.write("113\n");
document.write("114\n");
document.write("115\n");
document.write("116\n");
document.write("117\n");
document.write("118\n");
document.write("119\n");
document.write("120\n");
document.write("121\n");
document.write("122\n");
document.write("123\n");
document.write("124\n");
document.write("<\/pre>\n");
document.write("			<\/td>\n");
document.write("		<td>\n");
document.write("		<pre class=\"textmate-source\"><pre class=\"sunburst\"><span class=\'comment comment_line comment_line_number-sign comment_line_number-sign_python\'>## gae_memcache_accumulator<\/span>\n");
document.write("<span class=\'comment comment_line comment_line_number-sign comment_line_number-sign_python\'>## mark wolgemuth http://node.to<\/span>\n");
document.write("\n");
document.write("<span class=\'keyword keyword_control keyword_control_import keyword_control_import_from keyword_control_import_from_python\'>from<\/span> google.appengine.api <span class=\'keyword keyword_control keyword_control_import keyword_control_import_python\'>import<\/span> memcache\n");
document.write("<span class=\'keyword keyword_control keyword_control_import keyword_control_import_python\'>import<\/span> types\n");
document.write("\n");
document.write("COUNTERKEY <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'string string_quoted string_quoted_single string_quoted_single_single-line string_quoted_single_single-line_python\'>\'c\'<\/span>\n");
document.write("\n");
document.write("<span class=\'meta meta_class meta_class_python\'><span class=\'storage storage_type storage_type_class storage_type_class_python\'>class<\/span> <span class=\'entity entity_name entity_name_type entity_name_type_class entity_name_type_class_python\'>MemcacheAccumulatorError<\/span>(<span class=\'meta meta_class meta_class_inheritance meta_class_inheritance_python\'><span class=\'entity entity_other entity_other_inherited-class entity_other_inherited-class_python\'><span class=\'support support_type support_type_exception support_type_exception_python\'>Exception<\/span><\/span><\/span>):<\/span>\n");
document.write("    <span class=\'string string_quoted string_quoted_double string_quoted_double_block string_quoted_double_block_python\'>&quot;&quot;&quot;Error in memcache accumumalator&quot;&quot;&quot;<\/span>\n");
document.write("    <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>pass<\/span>\n");
document.write("\n");
document.write("<span class=\'meta meta_class meta_class_python\'><span class=\'storage storage_type storage_type_class storage_type_class_python\'>class<\/span> <span class=\'entity entity_name entity_name_type entity_name_type_class entity_name_type_class_python\'>MemcacheAccumulatorComplete<\/span>(<span class=\'meta meta_class meta_class_inheritance meta_class_inheritance_python\'><span class=\'entity entity_other entity_other_inherited-class entity_other_inherited-class_python\'>MemcacheAccumulatorError<\/span><\/span>):<\/span>\n");
document.write("    <span class=\'string string_quoted string_quoted_double string_quoted_double_block string_quoted_double_block_python\'>&quot;&quot;&quot;All pieces recieved&quot;&quot;&quot;<\/span>\n");
document.write("<span class=\'meta meta_function meta_function_python\'>    <span class=\'storage storage_type storage_type_function storage_type_function_python\'>def<\/span> <span class=\'entity entity_name entity_name_function entity_name_function_python\'><span class=\'support support_function support_function_magic support_function_magic_python\'>__init__<\/span><\/span>(<span class=\'meta meta_function meta_function_parameters meta_function_parameters_python\'><span class=\'variable variable_parameter variable_parameter_function variable_parameter_function_python\'>self<\/span>, *<span class=\'variable variable_parameter variable_parameter_function variable_parameter_function_python\'>args<\/span>, **<span class=\'variable variable_parameter variable_parameter_function variable_parameter_function_python\'>kw<\/span><\/span>):<\/span>\n");
document.write("        <span class=\'meta meta_function-call meta_function-call_python\'><span class=\'support support_type support_type_python\'>super<\/span>(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'>MemcacheAccumulatorComplete, <span class=\'variable variable_language variable_language_python\'>self<\/span><\/span>)<\/span>.<span class=\'meta meta_function-call meta_function-call_python\'>__init__(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_python\'>*<\/span>args<\/span>)<\/span>\n");
document.write("        <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>if<\/span> <span class=\'string string_quoted string_quoted_double string_quoted_double_single-line string_quoted_double_single-line_python\'>&quot;size&quot;<\/span> <span class=\'keyword keyword_operator keyword_operator_logical keyword_operator_logical_python\'>in<\/span> kw:\n");
document.write("            <span class=\'variable variable_language variable_language_python\'>self<\/span>.size <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'meta meta_item-access meta_item-access_python\'>kw[<span class=\'meta meta_item-access meta_item-access_arguments meta_item-access_arguments_python\'><span class=\'string string_quoted string_quoted_double string_quoted_double_single-line string_quoted_double_single-line_python\'>&quot;size&quot;<\/span><\/span>]<\/span>\n");
document.write("\n");
document.write("<span class=\'meta meta_class meta_class_python\'><span class=\'storage storage_type storage_type_class storage_type_class_python\'>class<\/span> <span class=\'entity entity_name entity_name_type entity_name_type_class entity_name_type_class_python\'>MemcacheAccumulatorIncomplete<\/span>(<span class=\'meta meta_class meta_class_inheritance meta_class_inheritance_python\'><span class=\'entity entity_other entity_other_inherited-class entity_other_inherited-class_python\'>MemcacheAccumulatorError<\/span><\/span>):<\/span>\n");
document.write("    <span class=\'string string_quoted string_quoted_double string_quoted_double_block string_quoted_double_block_python\'>&quot;&quot;&quot;Pieces are missing!&quot;&quot;&quot;<\/span>\n");
document.write("    <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>pass<\/span>\n");
document.write("\n");
document.write("<span class=\'meta meta_function meta_function_python\'><span class=\'storage storage_type storage_type_function storage_type_function_python\'>def<\/span> <span class=\'entity entity_name entity_name_function entity_name_function_python\'>counter_key<\/span>(<span class=\'meta meta_function meta_function_parameters meta_function_parameters_python\'><span class=\'variable variable_parameter variable_parameter_function variable_parameter_function_python\'>groupkey<\/span> <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span><\/span>):<\/span>\n");
document.write("    <span class=\'string string_quoted string_quoted_double string_quoted_double_block string_quoted_double_block_python\'>&quot;&quot;&quot;Generate the key for the counter for this group.&quot;&quot;&quot;<\/span>\n");
document.write("    <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>if<\/span> (groupkey <span class=\'keyword keyword_operator keyword_operator_logical keyword_operator_logical_python\'>is<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span>): \n");
document.write("        <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>raise<\/span> <span class=\'meta meta_function-call meta_function-call_python\'>MemcacheAccumulatorError(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'string string_quoted string_quoted_single string_quoted_single_single-line string_quoted_single_single-line_python\'>\'key cannot be None\'<\/span><\/span>)<\/span>\n");
document.write("    <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>return<\/span> COUNTERKEY <span class=\'keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_python\'>+<\/span> groupkey\n");
document.write("\n");
document.write("<span class=\'meta meta_function meta_function_python\'><span class=\'storage storage_type storage_type_function storage_type_function_python\'>def<\/span> <span class=\'entity entity_name entity_name_function entity_name_function_python\'>frag_key<\/span>(<span class=\'meta meta_function meta_function_parameters meta_function_parameters_python\'><span class=\'variable variable_parameter variable_parameter_function variable_parameter_function_python\'>groupkey<\/span> <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span>, <span class=\'variable variable_parameter variable_parameter_function variable_parameter_function_python\'>frag<\/span> <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'constant constant_numeric constant_numeric_integer constant_numeric_integer_decimal constant_numeric_integer_decimal_python\'>0<\/span><\/span>):<\/span>\n");
document.write("    <span class=\'string string_quoted string_quoted_double string_quoted_double_block string_quoted_double_block_python\'>&quot;&quot;&quot;Generate a key for the current fragment of this group&quot;&quot;&quot;<\/span>\n");
document.write("    <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>return<\/span> groupkey <span class=\'keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_python\'>+<\/span> <span class=\'meta meta_function-call meta_function-call_python\'><span class=\'support support_type support_type_python\'>str<\/span>(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'>frag<\/span>)<\/span>\n");
document.write("\n");
document.write("<span class=\'meta meta_function meta_function_python\'><span class=\'storage storage_type storage_type_function storage_type_function_python\'>def<\/span> <span class=\'entity entity_name entity_name_function entity_name_function_python\'>group_create<\/span>(<span class=\'meta meta_function meta_function_parameters meta_function_parameters_python\'><span class=\'variable variable_parameter variable_parameter_function variable_parameter_function_python\'>groupkey<\/span> <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span><\/span>):<\/span>\n");
document.write("    <span class=\'string string_quoted string_quoted_double string_quoted_double_block string_quoted_double_block_python\'>&quot;&quot;&quot;Initialize this accumulation group. Base &quot;groupkey&quot; must be unique for this fragmented entity.&quot;&quot;&quot;<\/span>\n");
document.write("    <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>if<\/span> (groupkey <span class=\'keyword keyword_operator keyword_operator_logical keyword_operator_logical_python\'>is<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span>): \n");
document.write("        <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>raise<\/span> <span class=\'meta meta_function-call meta_function-call_python\'>MemcacheAccumulatorError(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'string string_quoted string_quoted_single string_quoted_single_single-line string_quoted_single_single-line_python\'>\'key cannot be None\'<\/span><\/span>)<\/span>\n");
document.write("    <span class=\'meta meta_function-call meta_function-call_python\'>memcache.set(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'meta meta_function-call meta_function-call_python\'>counter_key(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'>groupkey<\/span>)<\/span>, <span class=\'string string_quoted string_quoted_double string_quoted_double_single-line string_quoted_double_single-line_python\'>&quot;0&quot;<\/span><\/span>)<\/span>\n");
document.write("\n");
document.write("create <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> group_create\n");
document.write("\n");
document.write("<span class=\'meta meta_function meta_function_python\'><span class=\'storage storage_type storage_type_function storage_type_function_python\'>def<\/span> <span class=\'entity entity_name entity_name_function entity_name_function_python\'>add_or_create_and_add<\/span>(<span class=\'meta meta_function meta_function_parameters meta_function_parameters_python\'><span class=\'variable variable_parameter variable_parameter_function variable_parameter_function_python\'>groupkey<\/span> <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span>, <span class=\'variable variable_parameter variable_parameter_function variable_parameter_function_python\'>frag<\/span> <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span>, <span class=\'variable variable_parameter variable_parameter_function variable_parameter_function_python\'>size<\/span> <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'constant constant_numeric constant_numeric_integer constant_numeric_integer_decimal constant_numeric_integer_decimal_python\'>0<\/span>, <span class=\'variable variable_parameter variable_parameter_function variable_parameter_function_python\'>position<\/span> <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span><\/span>):<\/span>\n");
document.write("    <span class=\'string string_quoted string_quoted_double string_quoted_double_block string_quoted_double_block_python\'>&quot;&quot;&quot;If the group doesn\'t exist, create it. Add the fragment to the group.&quot;&quot;&quot;<\/span>\n");
document.write("    <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>if<\/span> <span class=\'meta meta_function-call meta_function-call_python\'>memcache.get(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'meta meta_function-call meta_function-call_python\'>counter_key(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'>groupkey<\/span>)<\/span><\/span>)<\/span> <span class=\'keyword keyword_operator keyword_operator_logical keyword_operator_logical_python\'>is<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span>:\n");
document.write("        <span class=\'meta meta_function-call meta_function-call_python\'>group_create(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'>groupkey<\/span>)<\/span>\n");
document.write("    <span class=\'meta meta_function-call meta_function-call_python\'>add(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'>groupkey, frag, size, position<\/span>)<\/span>\n");
document.write("\n");
document.write("add_or_create <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> add_or_create_and_add\n");
document.write("\n");
document.write("<span class=\'meta meta_function meta_function_python\'><span class=\'storage storage_type storage_type_function storage_type_function_python\'>def<\/span> <span class=\'entity entity_name entity_name_function entity_name_function_python\'>add<\/span>(<span class=\'meta meta_function meta_function_parameters meta_function_parameters_python\'><span class=\'variable variable_parameter variable_parameter_function variable_parameter_function_python\'>groupkey<\/span> <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span>, <span class=\'variable variable_parameter variable_parameter_function variable_parameter_function_python\'>frag<\/span> <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span>, <span class=\'variable variable_parameter variable_parameter_function variable_parameter_function_python\'>size<\/span> <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'constant constant_numeric constant_numeric_integer constant_numeric_integer_decimal constant_numeric_integer_decimal_python\'>0<\/span>, <span class=\'variable variable_parameter variable_parameter_function variable_parameter_function_python\'>position<\/span> <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span><\/span>):<\/span>\n");
document.write("    <span class=\'string string_quoted string_quoted_double string_quoted_double_block string_quoted_double_block_python\'>&quot;&quot;&quot;Add the fragment to the accumulation group. <\/span>\n");
document.write("<span class=\"String\">Will raise MemcacheAccumulatorComplete when all fragments have been received.<\/span>\n");
document.write("<span class=\"String\">This is judged by comparing the add counter to the passed in size limit.<\/span>\n");
document.write("<span class=\"String\">User must always pass in an expected complete size. This shouldn\'t be a problem, <\/span>\n");
document.write("<span class=\"String\">since whatever made the fragments should no total size, and just needs to pass that <\/span>\n");
document.write("<span class=\"String\">to server in every fragment object.<\/span>\n");
document.write("<span class=\"String\">The fragment ordering is automatic on order of receipt, since you could also store<\/span>\n");
document.write("<span class=\"String\">\'real\' position in the fragment object, however you can provide the optional <\/span>\n");
document.write("<span class=\"String\">position argument so that the returned complete array of fragments is already ordered.<\/span>\n");
document.write("<span class=\"String\">&quot;&quot;&quot;<\/span>\n");
document.write("    <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>if<\/span> (groupkey <span class=\'keyword keyword_operator keyword_operator_logical keyword_operator_logical_python\'>is<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span>) <span class=\'keyword keyword_operator keyword_operator_logical keyword_operator_logical_python\'>or<\/span> (frag <span class=\'keyword keyword_operator keyword_operator_logical keyword_operator_logical_python\'>is<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span>):\n");
document.write("        <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>raise<\/span> <span class=\'meta meta_function-call meta_function-call_python\'>MemcacheAccumulatorError(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'string string_quoted string_quoted_single string_quoted_single_single-line string_quoted_single_single-line_python\'>\'key, frag cannot be None\'<\/span><\/span>)<\/span>\n");
document.write("    <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>if<\/span> size <span class=\'keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_python\'>&lt;<\/span> <span class=\'constant constant_numeric constant_numeric_integer constant_numeric_integer_decimal constant_numeric_integer_decimal_python\'>1<\/span>: <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>raise<\/span> <span class=\'meta meta_function-call meta_function-call_python\'>MemcacheAccumulatorError(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'string string_quoted string_quoted_single string_quoted_single_single-line string_quoted_single_single-line_python\'>\'size cannot be &lt; 1\'<\/span><\/span>)<\/span>\n");
document.write("    idx <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> count <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'meta meta_function-call meta_function-call_python\'>memcache.incr(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'meta meta_function-call meta_function-call_python\'>counter_key(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'>groupkey<\/span>)<\/span><\/span>)<\/span>\n");
document.write("    <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>if<\/span> idx <span class=\'keyword keyword_operator keyword_operator_logical keyword_operator_logical_python\'>is<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span>:\n");
document.write("        <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>raise<\/span> <span class=\'meta meta_function-call meta_function-call_python\'>MemcacheAccumulatorError(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'string string_quoted string_quoted_single string_quoted_single_single-line string_quoted_single_single-line_python\'>\'group does not exist\'<\/span><\/span>)<\/span>\n");
document.write("    <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>if<\/span> (count <span class=\'keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_python\'>&gt;<\/span> size):\n");
document.write("        <span class=\'meta meta_function-call meta_function-call_python\'>memcache.decr(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'meta meta_function-call meta_function-call_python\'>counter_key(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'>groupkey<\/span>)<\/span><\/span>)<\/span> <span class=\'comment comment_line comment_line_number-sign comment_line_number-sign_python\'># fix the counter<\/span>\n");
document.write("        <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>raise<\/span> <span class=\'meta meta_function-call meta_function-call_python\'>MemcacheAccumulatorComplete(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'string string_quoted string_quoted_double string_quoted_double_single-line string_quoted_double_single-line_python\'>&quot;already accumulated: <span class=\'constant constant_other constant_other_placeholder constant_other_placeholder_python\'>%s<\/span>&quot;<\/span> <span class=\'keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_python\'>%<\/span> groupkey<\/span>)<\/span>\n");
document.write("    <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>if<\/span> position <span class=\'keyword keyword_operator keyword_operator_logical keyword_operator_logical_python\'>is<\/span> <span class=\'keyword keyword_operator keyword_operator_logical keyword_operator_logical_python\'>not<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span>:\n");
document.write("        <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>if<\/span> (<span class=\'meta meta_function-call meta_function-call_python\'><span class=\'support support_type support_type_python\'>type<\/span>(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'>position<\/span>)<\/span> <span class=\'keyword keyword_operator keyword_operator_logical keyword_operator_logical_python\'>not<\/span> <span class=\'keyword keyword_operator keyword_operator_logical keyword_operator_logical_python\'>in<\/span> (types.IntType, types.LongType)):\n");
document.write("            <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>raise<\/span> <span class=\'meta meta_function-call meta_function-call_python\'>MemcacheAccumulatorError(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'string string_quoted string_quoted_double string_quoted_double_single-line string_quoted_double_single-line_python\'>&quot;position must be integer&quot;<\/span><\/span>)<\/span>\n");
document.write("        <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>if<\/span> position <span class=\'keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_python\'>&gt;<\/span> size <span class=\'keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_python\'>-<\/span> <span class=\'constant constant_numeric constant_numeric_integer constant_numeric_integer_decimal constant_numeric_integer_decimal_python\'>1<\/span>:\n");
document.write("            <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>raise<\/span> <span class=\'meta meta_function-call meta_function-call_python\'>MemcacheAccumulatorError(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'string string_quoted string_quoted_double string_quoted_double_single-line string_quoted_double_single-line_python\'>&quot;position cannot be greater than size&quot;<\/span><\/span>)<\/span>\n");
document.write("        idx <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> position\n");
document.write("    <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>else<\/span>:\n");
document.write("        idx <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> idx <span class=\'keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_python\'>-<\/span> <span class=\'constant constant_numeric constant_numeric_integer constant_numeric_integer_decimal constant_numeric_integer_decimal_python\'>1<\/span> <span class=\'comment comment_line comment_line_number-sign comment_line_number-sign_python\'># counter is counting, idx becomes like array index<\/span>\n");
document.write("    <span class=\'meta meta_function-call meta_function-call_python\'>memcache.add(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'meta meta_function-call meta_function-call_python\'>frag_key(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'>groupkey, idx<\/span>)<\/span>, frag<\/span>)<\/span>\n");
document.write("    <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>if<\/span> (count) <span class=\'keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_python\'>==<\/span> size:\n");
document.write("        <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>raise<\/span> <span class=\'meta meta_function-call meta_function-call_python\'>MemcacheAccumulatorComplete(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'string string_quoted string_quoted_double string_quoted_double_single-line string_quoted_double_single-line_python\'>&quot;accumulated: <span class=\'constant constant_other constant_other_placeholder constant_other_placeholder_python\'>%s<\/span> size: <span class=\'constant constant_other constant_other_placeholder constant_other_placeholder_python\'>%d<\/span>&quot;<\/span> <span class=\'keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_python\'>%<\/span> (groupkey, size), <span class=\'variable variable_parameter variable_parameter_function variable_parameter_function_python\'>size<\/span> <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> size<\/span>)<\/span>\n");
document.write("\n");
document.write("<span class=\'meta meta_function meta_function_python\'><span class=\'storage storage_type storage_type_function storage_type_function_python\'>def<\/span> <span class=\'entity entity_name entity_name_function entity_name_function_python\'>get_complete<\/span>(<span class=\'meta meta_function meta_function_parameters meta_function_parameters_python\'><span class=\'variable variable_parameter variable_parameter_function variable_parameter_function_python\'>groupkey<\/span> <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span>, <span class=\'variable variable_parameter variable_parameter_function variable_parameter_function_python\'>cleanup<\/span> <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'constant constant_language constant_language_python\'>True<\/span>, <span class=\'variable variable_parameter variable_parameter_function variable_parameter_function_python\'>size<\/span> <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span><\/span>):<\/span>\n");
document.write("    <span class=\'string string_quoted string_quoted_double string_quoted_double_block string_quoted_double_block_python\'>&quot;&quot;&quot;Returns the completed accumulation. Should be called after the <\/span>\n");
document.write("<span class=\"String\">MemcacheAccumulatorComplete exception is raised. If the cleanup option is true,<\/span>\n");
document.write("<span class=\"String\">it will not destroy the cache after reconstruction is complete. It defaults to False.<\/span>\n");
document.write("<span class=\"String\">If you want, you can check if your current accumulation is complete by passing in <\/span>\n");
document.write("<span class=\"String\">the expected size. MemcacheAccumulatorIncomplete is raised if incomplete.<\/span>\n");
document.write("<span class=\"String\">This could also be raised if a fragment was deleted by the server outside our control.<\/span>\n");
document.write("<span class=\"String\">&quot;&quot;&quot;<\/span>\n");
document.write("    <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>if<\/span> (groupkey <span class=\'keyword keyword_operator keyword_operator_logical keyword_operator_logical_python\'>is<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span>): <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>raise<\/span> <span class=\'meta meta_function-call meta_function-call_python\'>MemcacheAccumulatorError(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'string string_quoted string_quoted_single string_quoted_single_single-line string_quoted_single_single-line_python\'>\'key cannot be None\'<\/span><\/span>)<\/span>\n");
document.write("    <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>if<\/span> size <span class=\'keyword keyword_operator keyword_operator_logical keyword_operator_logical_python\'>is<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span>:\n");
document.write("        <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>try<\/span>:\n");
document.write("            size <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'meta meta_function-call meta_function-call_python\'><span class=\'support support_type support_type_python\'>int<\/span>(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'meta meta_function-call meta_function-call_python\'>memcache.get(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'meta meta_function-call meta_function-call_python\'>counter_key(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'>groupkey<\/span>)<\/span><\/span>)<\/span><\/span>)<\/span>\n");
document.write("        <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>except<\/span> <span class=\'support support_type support_type_exception support_type_exception_python\'>TypeError<\/span>:\n");
document.write("            <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>raise<\/span> <span class=\'meta meta_function-call meta_function-call_python\'>MemcacheAccumulatorError(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'string string_quoted string_quoted_single string_quoted_single_single-line string_quoted_single_single-line_python\'>\'group does not exist\'<\/span><\/span>)<\/span>\n");
document.write("    keys <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'meta meta_structure meta_structure_list meta_structure_list_python\'>[<span class=\'meta meta_structure meta_structure_list meta_structure_list_item meta_structure_list_item_python\'><span class=\'meta meta_function-call meta_function-call_python\'><span class=\'support support_type support_type_python\'>str<\/span>(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'>x<\/span>)<\/span> <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>for<\/span> x <span class=\'keyword keyword_operator keyword_operator_logical keyword_operator_logical_python\'>in<\/span> <span class=\'meta meta_function-call meta_function-call_python\'><span class=\'support support_function support_function_builtin support_function_builtin_python\'>range<\/span>(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'>size<\/span>)<\/span><\/span>]<\/span>\n");
document.write("    frags <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'meta meta_function-call meta_function-call_python\'>memcache.get_multi(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'>keys, groupkey<\/span>)<\/span>\n");
document.write("    ordered <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'meta meta_structure meta_structure_list meta_structure_list_python\'>[<span class=\'meta meta_structure meta_structure_list meta_structure_list_item meta_structure_list_item_python\'><span class=\'constant constant_language constant_language_python\'>None<\/span> <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>for<\/span> x <span class=\'keyword keyword_operator keyword_operator_logical keyword_operator_logical_python\'>in<\/span> <span class=\'meta meta_function-call meta_function-call_python\'><span class=\'support support_function support_function_builtin support_function_builtin_python\'>range<\/span>(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'>size<\/span>)<\/span><\/span>]<\/span>\n");
document.write("    <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>for<\/span> i <span class=\'keyword keyword_operator keyword_operator_logical keyword_operator_logical_python\'>in<\/span> keys:\n");
document.write("        <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>try<\/span>: <span class=\'comment comment_line comment_line_number-sign comment_line_number-sign_python\'># memcache deleted us. don\'t use this if this is not ok!!!<\/span>\n");
document.write("            <span class=\'meta meta_item-access meta_item-access_python\'>ordered[<span class=\'meta meta_item-access meta_item-access_arguments meta_item-access_arguments_python\'><span class=\'meta meta_function-call meta_function-call_python\'><span class=\'support support_type support_type_python\'>int<\/span>(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'>i<\/span>)<\/span><\/span>]<\/span> <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'meta meta_item-access meta_item-access_python\'>frags[<span class=\'meta meta_item-access meta_item-access_arguments meta_item-access_arguments_python\'>i<\/span>]<\/span>\n");
document.write("        <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>except<\/span> <span class=\'support support_type support_type_exception support_type_exception_python\'>KeyError<\/span>:\n");
document.write("            <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>raise<\/span> <span class=\'meta meta_function-call meta_function-call_python\'>MemcacheAccumulatorIncomplete(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'string string_quoted string_quoted_double string_quoted_double_single-line string_quoted_double_single-line_python\'>&quot;group missing pieces: <span class=\'constant constant_other constant_other_placeholder constant_other_placeholder_python\'>%s<\/span>&quot;<\/span> <span class=\'keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_python\'>%<\/span> groupkey<\/span>)<\/span>\n");
document.write("    <span class=\'comment comment_line comment_line_number-sign comment_line_number-sign_python\'># ok, cleanup the pieces now<\/span>\n");
document.write("    <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>if<\/span> cleanup:\n");
document.write("        <span class=\'meta meta_function-call meta_function-call_python\'>group_destroy(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'>groupkey, keys<\/span>)<\/span>\n");
document.write("\n");
document.write("    <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>return<\/span> ordered\n");
document.write("\n");
document.write("get <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> get_complete\n");
document.write("\n");
document.write("<span class=\'meta meta_function meta_function_python\'><span class=\'storage storage_type storage_type_function storage_type_function_python\'>def<\/span> <span class=\'entity entity_name entity_name_function entity_name_function_python\'>group_destroy<\/span>(<span class=\'meta meta_function meta_function_parameters meta_function_parameters_python\'><span class=\'variable variable_parameter variable_parameter_function variable_parameter_function_python\'>groupkey<\/span> <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span>, <span class=\'variable variable_parameter variable_parameter_function variable_parameter_function_python\'>keys<\/span> <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span><\/span>):<\/span>\n");
document.write("    <span class=\'string string_quoted string_quoted_double string_quoted_double_block string_quoted_double_block_python\'>&quot;&quot;&quot;Destroys all caches related to the group, fragments and counter.&quot;&quot;&quot;<\/span>\n");
document.write("    <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>if<\/span> (groupkey <span class=\'keyword keyword_operator keyword_operator_logical keyword_operator_logical_python\'>is<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span>): <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>raise<\/span> <span class=\'meta meta_function-call meta_function-call_python\'>MemcacheAccumulatorError(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'string string_quoted string_quoted_single string_quoted_single_single-line string_quoted_single_single-line_python\'>\'key cannot be None\'<\/span><\/span>)<\/span>\n");
document.write("    <span class=\'comment comment_line comment_line_number-sign comment_line_number-sign_python\'># optimization, trust passed keys<\/span>\n");
document.write("    <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>if<\/span> keys <span class=\'keyword keyword_operator keyword_operator_logical keyword_operator_logical_python\'>is<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span>:\n");
document.write("        size <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'meta meta_function-call meta_function-call_python\'><span class=\'support support_type support_type_python\'>int<\/span>(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'meta meta_function-call meta_function-call_python\'>memcache.get(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'meta meta_function-call meta_function-call_python\'>counter_key(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'>groupkey<\/span>)<\/span><\/span>)<\/span><\/span>)<\/span>\n");
document.write("        keys <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'meta meta_structure meta_structure_list meta_structure_list_python\'>[<span class=\'meta meta_structure meta_structure_list meta_structure_list_item meta_structure_list_item_python\'><span class=\'meta meta_function-call meta_function-call_python\'><span class=\'support support_type support_type_python\'>str<\/span>(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'>x<\/span>)<\/span> <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>for<\/span> x <span class=\'keyword keyword_operator keyword_operator_logical keyword_operator_logical_python\'>in<\/span> <span class=\'meta meta_function-call meta_function-call_python\'><span class=\'support support_function support_function_builtin support_function_builtin_python\'>range<\/span>(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'>size<\/span>)<\/span><\/span>]<\/span>\n");
document.write("    <span class=\'meta meta_function-call meta_function-call_python\'>memcache.delete_multi(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'>keys, <span class=\'constant constant_numeric constant_numeric_integer constant_numeric_integer_decimal constant_numeric_integer_decimal_python\'>0<\/span>, groupkey<\/span>)<\/span>\n");
document.write("    <span class=\'meta meta_function-call meta_function-call_python\'>memcache.delete(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'meta meta_function-call meta_function-call_python\'>counter_key(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'>groupkey<\/span>)<\/span><\/span>)<\/span>\n");
document.write("\n");
document.write("<span class=\'meta meta_function meta_function_python\'><span class=\'storage storage_type storage_type_function storage_type_function_python\'>def<\/span> <span class=\'entity entity_name entity_name_function entity_name_function_python\'>get_position<\/span>(<span class=\'meta meta_function meta_function_parameters meta_function_parameters_python\'><span class=\'variable variable_parameter variable_parameter_function variable_parameter_function_python\'>groupkey<\/span> <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'constant constant_language constant_language_python\'>None<\/span>, <span class=\'variable variable_parameter variable_parameter_function variable_parameter_function_python\'>position<\/span> <span class=\'keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_python\'>=<\/span> <span class=\'constant constant_numeric constant_numeric_integer constant_numeric_integer_decimal constant_numeric_integer_decimal_python\'>0<\/span><\/span>):<\/span>\n");
document.write("    <span class=\'string string_quoted string_quoted_double string_quoted_double_block string_quoted_double_block_python\'>&quot;&quot;&quot;Returns the fragment at position. See &quot;add&quot; documentation about positioning.&quot;&quot;&quot;<\/span>\n");
document.write("    <span class=\'keyword keyword_control keyword_control_flow keyword_control_flow_python\'>return<\/span> <span class=\'meta meta_function-call meta_function-call_python\'>memcache.get(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'><span class=\'meta meta_function-call meta_function-call_python\'>frag_key(<span class=\'meta meta_function-call meta_function-call_arguments meta_function-call_arguments_python\'>groupkey, position<\/span>)<\/span><\/span>)<\/span>\n");
document.write("<\/pre><\/pre>\n");
document.write("		<\/td>\n");
document.write("		<\/tr>\n");
document.write("		<\/table>\n");
document.write("	\n");
document.write("	<\/div>\n");
document.write("\n");
document.write("\n");
document.write("  \n");
document.write("  \n");
document.write("  <div class=\"credit\">\n");
document.write("    <div class=\"buttons\">\n");
document.write("      <a href=\"http://pastie.org/pastes/486368.txt\">\n");
document.write("      <img src=\"http://pastie.org/images/view.png\" height=\"20\" width=\"67\" /><\/a>\n");
document.write("    <\/div>\n");
document.write("  \n");
document.write("    <a href=\"http://pastie.org/486368\">Pastie #486368<\/a> linked directly from <a href=\"http://pastie.org/\">Pastie<\/a>.\n");
document.write("  <\/div><\/div>");

