{"id":175459,"date":"2013-04-04T16:29:03","date_gmt":"2013-04-04T12:29:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=175459"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=175459","title":{"rendered":"<span class=\"post_title\">\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 MySQL \u043d\u0430 PostgreSQL<\/span>"},"content":{"rendered":"<div class=\"content html_format\"> \t\t\t\u041f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0441 \u0438\u0445 \u043f\u043b\u044e\u0441\u0430\u043c\u0438 \u0438 \u043c\u0438\u043d\u0443\u0441\u0430\u043c\u0438, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0421\u0423\u0411\u0414 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441 MySQL \u043d\u0430 PostgreSQL. \u0412\u043e\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0432\u043a\u0443\u0441\u043d\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0436\u0434\u0443\u0442 \u043e\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043d\u0430 PostgreSQL, \u0432\u0435\u0440\u0441\u0438\u0438 9.2 (\u0441 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u0441\u044f <a href=\"http:\/\/www.postgresql.org\/about\/featurematrix\/\">\u0442\u0443\u0442<\/a>):  <\/p>\n<ul>\n<li><a href=\"http:\/\/www.postgresql.org\/docs\/9.2\/static\/ddl-inherit.html\">\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446<\/a> (\u0435\u0441\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u0435\u0449\u0430\u044e\u0442 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c)<\/li>\n<li><a href=\"http:\/\/www.postgresql.org\/docs\/9.2\/static\/rangetypes.html\">\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u044b<\/a>: int4range, numrange, daterange<\/li>\n<li>\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f\u0437\u044b\u043a\u043e\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 (PL\/pgSQL, PL\/Tcl, PL\/Perl, PL\/Python \u0438 \u0433\u043e\u043b\u044b\u0439 C)<\/li>\n<li>\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <a href=\"http:\/\/www.postgresql.org\/docs\/9.2\/static\/queries-with.html\">WITH<\/a>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b<\/li>\n<li><i>(\u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f)<\/i> \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f (\u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u043e\u043d\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438 \u0441\u0435\u0439\u0447\u0430\u0441 \u2014 \u043a\u0430\u043a IUD \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043a \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044e) <\/li>\n<li><i>(\u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f)<\/i> \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u043d\u0430 DDL \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438<\/li>\n<\/ul>\n<p>  \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u043f\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u043c SQL \u0434\u0430\u043c\u043f\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u043c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0411\u0414. \u041d\u043e \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 (\u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u0435\u0441\u044f \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043e\u0431\u044a\u0435\u043c\u043e\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438) \u0442\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0435\u0441\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 SQL \u0434\u0430\u043c\u043f\u0430 \u0438\u0437 \u0421\u0423\u0411\u0414, \u0435\u0433\u043e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u0434\u0430\u043c\u043f\u0430 \u0441\u043d\u043e\u0432\u0430 \u0432 \u0421\u0423\u0411\u0414. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 online-\u0432\u0430\u0440\u0438\u0430\u043d\u0442 (\u043f\u0440\u044f\u043c\u0438\u043a\u043e\u043c \u0438\u0437 \u0421\u0423\u0411\u0414 \u0432 \u0421\u0423\u0411\u0414) \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u0430, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<br \/>  <a name=\"habracut\"><\/a><br \/>  \u042f\u0437\u044b\u043a\u043e\u043c \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u044b\u0431\u0440\u0430\u043d C++ (\u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0438\u0437 C++11x), \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 MySQL \u0438 PostgreSQL \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 IDE \u0431\u044b\u043b \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d Qt Creator.<\/p>\n<p>  \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c. \u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0442\u043e \u0432 \u0411\u0414-\u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u0435 \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0442\u0430\u0431\u043b\u0438\u0446, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0432 \u0411\u0414-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0435. \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0442\u0435\u043c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043f\u0443\u043b\u0435 \u043f\u043e\u0442\u043e\u043a\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0438\u043c\u0435\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0411\u0414-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0443 \u0438 \u043a \u0411\u0414-\u043f\u043e\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044e. \u0422.\u0435. \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u0431\u043b\u0438\u0446. Profit!<\/p>\n<p>  \u0422\u0440\u0430\u0434\u0438\u0446\u0438\u043e\u043d\u043d\u043e \u043b\u044e\u0431\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0430\u0440\u043a\u0430\u0441 \u2014 \u043d\u0430\u0431\u043e\u0440 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u2014 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u043e\u043c, \u043b\u043e\u0433\u043e\u043c, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043e\u0448\u0438\u0431\u043e\u043a, \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043f\u0440\u043e\u0447\u0435\u0435. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u043e\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u0431\u044b\u043b\u0438 \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b (\u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430) \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b (\u0434\u0430, \u0437\u043d\u0430\u044e, \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e <b>\u0430lias templates<\/b> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0442\u0430\u043a):  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0442\u0438\u043f\u044b<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">typedef bool t_bool;  typedef char t_char; typedef unsigned char t_uchar; typedef signed char t_schar;  typedef int t_int; typedef unsigned int t_uint;  typedef float t_float; typedef double t_double; <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">map<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">template&lt;typename T, typename U&gt; class CMap     : public std::map&lt;T, U&gt; { public:\t     CMap();     virtual ~CMap();  };  template&lt;typename T, typename U&gt; CMap&lt;T, U&gt;::CMap() { }  template&lt;typename T, typename U&gt; CMap&lt;T, U&gt;::~CMap() { } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">vector<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">template&lt;typename T&gt; class CVector     : public std::vector&lt;T&gt; { public:     CVector();     virtual ~CVector();  };  template&lt;typename T&gt; CVector&lt;T&gt;::CVector() { }  template&lt;typename T&gt; CVector&lt;T&gt;::~CVector() { } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">fstream<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">class CFileStream     : public std::fstream { public:     CFileStream();     virtual ~CFileStream();  }; <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0418\u0437 \u044f\u0432\u043d\u044b\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0438\u043d\u0433\u043b\u0442\u043e\u043d \u041c\u044d\u0439\u0435\u0440\u0441\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">template&lt;typename T&gt; class CSingleton { public:     static T* instance();     void free();  protected:     CSingleton();     virtual ~CSingleton();  };  template&lt;typename T&gt; T* CSingleton&lt;T&gt;::instance() {     static T *instance = new T();      return instance; }  template&lt;typename T&gt; void CSingleton&lt;T&gt;::free() {     delete this; }  template&lt;typename T&gt; CSingleton&lt;T&gt;::CSingleton() { }  template&lt;typename T&gt; CSingleton&lt;T&gt;::~CSingleton() { } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447\u0438 (\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435) \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438):  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">task.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">class CTask { public:\t     CTask();     virtual ~CTask();      void execute();      t_uint taskID();     t_bool isExecuted();  protected:     virtual void executeEvent() = 0;  private:     t_uint m_task_id;     t_bool m_executed;  }; <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">task.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">CTask::CTask()     : m_executed(false) {     static t_uint task_id = 0;      m_task_id = task_id++; }  CTask::~CTask() { }  void CTask::execute() {     executeEvent();      m_executed = true; }  t_uint CTask::taskID() {     return m_task_id; }  t_bool CTask::isExecuted() {     return m_executed; } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">system.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">class CSystem { public:     CSystem();     virtual ~CSystem() = 0;  protected:     void executeTask(CTask *task);  }; <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">system.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">CSystem::CSystem() { }  CSystem::~CSystem() { }  void CSystem::executeTask(CTask *task) {     CTask& task_ref = *task;      std::thread thread([&]() { task_ref.execute(); });      thread.detach(); } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0412 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u043d\u0443\u0436\u043d\u043e \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u0441\u0442\u0440\u043e\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441 \u043d\u0443\u043b\u044f, \u0447\u0442\u043e\u0431\u044b \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 (\u0437\u0430\u043c\u0435\u043d\u0430 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0438 \u0438 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f) \u0431\u044b\u043b\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u043c \u0431\u0443\u0444\u0435\u0440\u043e\u043c (\u043e \u043d\u0435\u043c \u0447\u0443\u0442\u044c \u043d\u0438\u0436\u0435) \u0431\u0435\u0437 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0435\u0449\u0438 (\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0447\u0438\u0441\u043b\u043e \u0438 \u0447\u0438\u0441\u043b\u0430 \u0432 \u0441\u0442\u0440\u043e\u043a\u0438) \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u043b\u0435\u043d\u0430\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u0430 (\u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0441\u0430):  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">string.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">class CString { public:     CString(const t_char *data = nullptr);     CString(const CString& s);     ~CString();      const t_char* ptr() const;     void setPtr(t_char *p);      CString& operator= (const CString& s);     CString operator+ (const t_char *p) const;     CString operator+ (t_char c) const;     CString operator+ (const CString& s) const;     friend CString operator+ (const t_char *p, const CString& s);     CString& operator+= (const t_char *p);     CString& operator+= (t_char c);     CString& operator+= (const CString& s);      t_bool operator== (const CString& s) const;     t_bool operator!= (const CString& s) const;      t_bool operator&lt; (const CString& s) const;     t_bool operator&gt; (const CString& s) const;     t_bool operator&lt;= (const CString& s) const;     t_bool operator&gt;= (const CString& s) const;      t_char& at(t_uint index);     t_char at(t_uint index) const;      t_uint length() const;     t_bool isEmpty() const;      void clear();      t_int search(const CString& s, t_uint from = 0) const;     CString substr(t_uint from, t_int count = -1) const;     CString replace(const CString& before, const CString& after) const;      static CString fromNumber(t_uint value);     static t_uint toUnsignedInt(const CString& s, t_bool *good = nullptr);      CVector&lt;CString&gt; split(const CString& splitter) const;     t_bool match(const CString& pattern) const;      static t_uint replacePtr(const t_char *src, const t_char *before, const t_char *after, char *buffer);     static t_uint lengthPtr(const t_char *src);     static t_uint concatenatePtr(const t_char *src, char *buffer);  private:     t_char *m_data;      t_uint length(const t_char *src) const;     t_char* copy(const t_char *src) const;     t_char* concatenate(const t_char *src0, t_char c) const;     t_char* concatenate(const t_char *src0, const t_char *src1) const;     t_int compare(const t_char *src0, const t_char *src1) const; };  CString operator+ (const t_char *p, const CString& s); <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u041a\u0430\u043a \u043d\u0435\u0438\u0437\u0431\u0435\u0436\u043d\u043e\u0441\u0442\u044c, \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0435\u043c \u00abHello,world\u00bb, \u044d\u0442\u043e \u043b\u043e\u0433 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b. \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043b\u043e\u0433 \u0431\u044b\u043b \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d \u043c\u044c\u044e\u0442\u0435\u043a\u0441, \u0442\u0430\u043a \u043a\u0430\u043a \u043a\u0430\u0436\u0434\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u043e \u043c\u0435\u0440\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u0438\u0448\u0435\u0442 \u043e\u0431 \u044d\u0442\u043e\u043c \u0432 \u043b\u043e\u0433. \u041c\u0435\u043b\u043a\u043e\u0433\u0440\u0430\u043d\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0438 lockfree-\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u043b\u0438\u0441\u044c \u043f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u043b\u043e\u0433 \u2014 \u044d\u0442\u043e \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0443\u0437\u043a\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0432 \u0440\u0430\u0431\u043e\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">log.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">class CLog     : public CSingleton&lt;CLog&gt; { public:     enum MessageType     {         Information,         Warning,         Error     };      CLog();     virtual ~CLog();      void information(const CString& message);     void warning(const CString& message);     void error(const CString& message);  private:     std::mutex m_mutex;      CFileStream m_stream;      void writeTimestamp();     void writeHeader();     void writeFooter();     void writeMessage(MessageType type, const CString& message);  }; <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">log.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">CLog::CLog() {     m_stream.open(&quot;log.txt&quot;, std::ios_base::out);      writeHeader(); }  CLog::~CLog() {     writeFooter();      m_stream.flush();     m_stream.close(); }  void CLog::information(const CString& message) {     writeMessage(Information, message); }  void CLog::warning(const CString& message) {     writeMessage(Warning, message); }  void CLog::error(const CString& message) {     writeMessage(Error, message); }  void CLog::writeTimestamp() {     time_t rawtime;     tm *timeinfo;     t_char buffer[32];      time(&rawtime);     timeinfo = localtime(&rawtime);      strftime(buffer, 32, &quot;%Y\/%m\/%d %H:%M:%S&quot;, timeinfo);      m_stream &lt;&lt; buffer &lt;&lt; &quot; &quot;; }  void CLog::writeHeader() {     writeMessage(Information, &quot;Log started&quot;); }  void CLog::writeFooter() {     writeMessage(Information, &quot;Log ended&quot;); }  void CLog::writeMessage(MessageType type, const CString& message) {     std::lock_guard&lt;std::mutex&gt; guard(m_mutex);      writeTimestamp();      switch (type)     {     case Information:         {             m_stream &lt;&lt; &quot;Information &quot; &lt;&lt; message.ptr();              break;         }      case Warning:         {             m_stream &lt;&lt; &quot;Warning &quot; &lt;&lt; message.ptr();              break;         }      case Error:         {             m_stream &lt;&lt; &quot;Error &quot; &lt;&lt; message.ptr();              break;         }      default:         {             break;         }     }      m_stream &lt;&lt; &quot;\\n&quot;;      m_stream.flush(); } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">config.h<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">class CConfig     : public CSingleton&lt;CConfig&gt; { public:     CConfig();     virtual ~CConfig();      CString value(const CString& name, const CString& defvalue = &quot;&quot;) const;  private:     CFileStream m_stream;     CMap&lt;CString, CString&gt; m_values;  }; <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">config.cpp<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">CConfig::CConfig() {     m_stream.open(&quot;mysql2psql.conf&quot;, std::ios_base::in);      if (m_stream.is_open())     {         CString line;          const t_uint buffer_size = 256;         t_char buffer[buffer_size];          while (m_stream.getline(buffer, buffer_size))         {             line = buffer;              if (!line.isEmpty() && line.at(0) != '#')             {                 t_int pos = line.search(&quot;=&quot;);                  CString name = line.substr(0, pos);                 CString value = line.substr(pos + 1);                  m_values.insert(std::pair&lt;CString, CString&gt;(name, value));             }         }          m_stream.close();          CLog::instance()-&gt;information(&quot;Config loaded&quot;);     }     else     {         CLog::instance()-&gt;warning(&quot;Can't load config&quot;);     } }  CConfig::~CConfig() { }  CString CConfig::value(const CString& name, const CString& defvalue) const {     CMap&lt;CString, CString&gt;::const_iterator iter = m_values.find(name);      if (iter != m_values.end())     {         return iter-&gt;second;     }      return defvalue; } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">mysql2psql.conf<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"bash\"># MySQL connection mysql_host=localhost mysql_port=3306 mysql_database=mysqldb mysql_username=root mysql_password=rootpwd mysql_encoding=UTF8  # PostgreSQL connection psql_host=localhost psql_port=5432 psql_database=psqldb psql_username=postgres psql_password=postgrespwd psql_encoding=UTF8  # Migration # (!) Note: source_schema == mysql_database source_schema=mysqldb destination_schema=public tables=* use_insert=0  # Other settings threads=16 <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u0447\u0442\u043e \u043a\u0430\u0441\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 PostgreSQL. \u0415\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b INSERT, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0441\u0435\u0431\u044f \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u0432 \u043f\u043b\u0430\u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 (\u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430), \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <a href=\"http:\/\/www.postgresql.org\/docs\/9.2\/static\/libpq-copy.html\">COPY<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u0442\u044c \u043f\u043e\u0440\u0446\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0440\u043a\u0435\u0440 (\u0441\u0438\u043c\u0432\u043e\u043b-\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440). \u0415\u0449\u0435 \u043e\u0434\u0438\u043d \u043d\u044e\u0430\u043d\u0441 \u0441\u0432\u044f\u0437\u0430\u043d \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u0442\u0438\u043f\u0430 (\u043f\u043e\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435) \u0432 PostgreSQL. \u0412 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043e (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0431\u044b\u043b\u043e \u0447\u0442\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0441\u0442\u0440\u043e\u043a \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438), \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0442\u0438\u043f\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 oid (<i>\u043f\u043e\u0447\u0442\u0438<\/i> \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0411\u0414) \u0438 \u0442\u0438\u043f\u0430:<\/p>\n<pre><code class=\"cpp\">case 20: \/\/ int8 case 21: \/\/ int2 case 23: \/\/ int4 case 1005: \/\/ int2 case 1007: \/\/ int4 case 1016: \/\/ int8 case 700: \/\/ float4 case 701: \/\/ float8 case 1021: \/\/ float4 case 1022: \/\/ float8 case 1700: \/\/ numeric case 18: \/\/ char case 25: \/\/ text case 1002: \/\/ char case 1009: \/\/ text case 1015: \/\/ varchar case 1082: \/\/ date case 1182: \/\/ date case 1083: \/\/ time case 1114: \/\/ timestamp case 1115: \/\/ timestamp case 1183: \/\/ time case 1185: \/\/ timestamptz case 16: \/\/ bool case 1000: \/\/ bool <\/code><\/pre>\n<p>  \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c:   <\/p>\n<ul>\n<li>\u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446<\/li>\n<li>\u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f (\u043f\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0437\u0430\u0434\u0430\u0447) \u043a \u0411\u0414-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0443 \u0438 \u0411\u0414-\u043f\u0440\u0438\u0435\u043c\u043d\u0438\u043a\u0443<\/li>\n<li>\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u044b \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446 \u0437\u0430\u0434\u0430\u0447\u0430\u043c<\/li>\n<li>\u0437\u0430\u0434\u0430\u0447\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 (\u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043e\u043c \u0442\u0430\u0431\u043b\u0438\u0446 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043a \u0411\u0414)<\/li>\n<li>\u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447 (\u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a + \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0442\u043e\u043a\u0438)<\/li>\n<\/ul>\n<p>  \u0412 \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0440\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0431\u0443\u0444\u0435\u0440\u0430 \u043f\u043e 50 \u041c\u0411, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b COPY (\u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0438 \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u043e\u043b\u0435\u0439):  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043a\u043e\u0434\u0430 c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">\/\/ create connection pool  t_uint threads = CString::toUnsignedInt(CConfig::instance()-&gt;value(&quot;threads&quot;, &quot;1&quot;)); CLog::instance()-&gt;information(&quot;Count of working threads: &quot; + CString::fromNumber(threads));  if (!createConnectionPool(threads - 1)) {     return false; }  \/\/ create tasks  CString destination_schema = CConfig::instance()-&gt;value(&quot;destination_schema&quot;);  t_uint range_begin = 0; t_uint range_end = 0;  t_uint range = m_tables.size() \/ threads;  for (t_uint i = 0, j = 0; i &lt; m_tables.size() - range; i += range + 1, ++j) {     range_begin = i;     range_end = i + range;      std::unique_ptr&lt;CTask&gt; task = std::unique_ptr&lt;CTask&gt;(new CMigrationTask(m_source_pool.at(j), m_destination_pool.at(j), destination_schema, m_tables, range_begin, range_end));      m_migration_tasks.push_back(std::move(task)); }  range_begin = range_end + 1; range_end = m_tables.size() - 1;  std::unique_ptr&lt;CTask&gt; task = std::unique_ptr&lt;CTask&gt;(new CMigrationTask(std::move(m_source), std::move(m_destination), destination_schema, m_tables, range_begin, range_end));  \/\/ executing tasks  for (t_uint i = 0; i &lt; m_migration_tasks.size(); ++i) {     executeTask(m_migration_tasks.at(i).get()); }  task-&gt;execute();  \/\/ wait for completion  for (t_uint i = 0; i &lt; m_migration_tasks.size(); ++i) {     while (!m_migration_tasks.at(i)-&gt;isExecuted())     {     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u043a\u043e\u0434\u0430 \u0441 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u043e\u0439 \u0432 \u0437\u0430\u0434\u0430\u0447\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f COPY<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">t_uint count = 0; t_char *value;  CString copy_query = &quot;COPY &quot; + m_destination_schema + &quot;.&quot; + table + &quot; ( &quot;;  m_buffer[0] = '\\0'; m_buffer_temp0[0] = '\\0'; m_buffer_temp1[0] = '\\0';  if (result-&gt;nextRecord()) {     for (t_uint i = 0; i &lt; result-&gt;columnCount(); ++i)     {         if (i != 0)         {             copy_query += &quot;, &quot;;             CString::concatenatePtr(&quot;\\t&quot;, m_buffer);         }          copy_query += result-&gt;columnName(i);          if (!result-&gt;isColumnNull(i))         {             value = result-&gt;columnValuePtr(i);                  CString::replacePtr(value, &quot;\\\\&quot;, &quot;\\\\\\\\&quot;, m_buffer_temp0);             CString::replacePtr(m_buffer_temp0, &quot;\\b&quot;, &quot;\\\\b&quot;, m_buffer_temp1);             CString::replacePtr(m_buffer_temp1, &quot;\\f&quot;, &quot;\\\\f&quot;, m_buffer_temp0);             CString::replacePtr(m_buffer_temp0, &quot;\\n&quot;, &quot;\\\\n&quot;, m_buffer_temp1);             CString::replacePtr(m_buffer_temp1, &quot;\\r&quot;, &quot;\\\\r&quot;, m_buffer_temp0);             CString::replacePtr(m_buffer_temp0, &quot;\\t&quot;, &quot;\\\\t&quot;, m_buffer_temp1);             CString::replacePtr(m_buffer_temp1, &quot;\\v&quot;, &quot;\\\\v&quot;, m_buffer_temp0);              CString::concatenatePtr(m_buffer_temp0, m_buffer);         }         else         {             CString::concatenatePtr(&quot;\\\\N&quot;, m_buffer);         }     }      copy_query += &quot; ) FROM STDIN&quot;;      if (!m_destination_connection-&gt;copyOpen(copy_query))     {         CLog::instance()-&gt;error(&quot;Can't execute query '&quot; + copy_query + &quot;', error: &quot; + m_destination_connection-&gt;lastError());          return false;     }      CString::concatenatePtr(&quot;\\n&quot;, m_buffer);      if (!m_destination_connection-&gt;copyDataPtr(m_buffer))     {         CLog::instance()-&gt;error(&quot;Can't copy data, error: &quot; + m_destination_connection-&gt;lastError());          return false;     }      ++count;      while (result-&gt;nextRecord())     {         m_buffer[0] = '\\0';          for (t_uint i = 0; i &lt; result-&gt;columnCount(); ++i)         {             if (i != 0)             {                 CString::concatenatePtr(&quot;\\t&quot;, m_buffer);             }              if (!result-&gt;isColumnNull(i))             {\t                 value = result-&gt;columnValuePtr(i);                  CString::replacePtr(value, &quot;\\\\&quot;, &quot;\\\\\\\\&quot;, m_buffer_temp0);                 CString::replacePtr(m_buffer_temp0, &quot;\\b&quot;, &quot;\\\\b&quot;, m_buffer_temp1);                 CString::replacePtr(m_buffer_temp1, &quot;\\f&quot;, &quot;\\\\f&quot;, m_buffer_temp0);                 CString::replacePtr(m_buffer_temp0, &quot;\\n&quot;, &quot;\\\\n&quot;, m_buffer_temp1);                 CString::replacePtr(m_buffer_temp1, &quot;\\r&quot;, &quot;\\\\r&quot;, m_buffer_temp0);                 CString::replacePtr(m_buffer_temp0, &quot;\\t&quot;, &quot;\\\\t&quot;, m_buffer_temp1);                 CString::replacePtr(m_buffer_temp1, &quot;\\v&quot;, &quot;\\\\v&quot;, m_buffer_temp0);                      CString::concatenatePtr(m_buffer_temp0, m_buffer);             }             else             {                  CString::concatenatePtr(&quot;\\\\N&quot;, m_buffer);             }         }          CString::concatenatePtr(&quot;\\n&quot;, m_buffer);          if (!m_destination_connection-&gt;copyDataPtr(m_buffer))         {             CLog::instance()-&gt;error(&quot;Can't copy data, error: &quot; + m_destination_connection-&gt;lastError());              return false;         }          ++count;          if (count % 250000 == 0)         {             CLog::instance()-&gt;information(&quot;Working task #&quot; + CString::fromNumber(taskID()) + &quot;:\\t\\ttable &quot; + table + &quot; processing, record count: &quot; + CString::fromNumber(count));         }     } }  <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<h5>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b<\/h5>\n<p>  \u0414\u043b\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 2 \u0413\u0431 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 PostgreSQL, c \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c WAL-\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c, \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0440\u044f\u0434\u043a\u0430 10 \u043c\u0438\u043d\u0443\u0442 (\u0441\u043e\u0437\u0434\u0430\u043d\u043e 16 \u043f\u043e\u0442\u043e\u043a\u043e\u0432).<\/p>\n<h5>\u041d\u0430\u0434 \u0447\u0435\u043c \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c<\/h5>\n<p>  <\/p>\n<ul>\n<li>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0437\u0430\u0434\u0430\u0447\u0430\/\u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u2014 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439<\/li>\n<li>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u043e\u0434 \u0431\u0443\u0444\u0435\u0440, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0433\u043e\u0442\u043e\u0432\u044f\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f COPY<\/li>\n<li>\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446 \u043c\u0435\u0436\u0434\u0443 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 \u043d\u0435 \u043f\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0443, \u0430 \u043f\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u2014 \u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u0435\u0440\u0443\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438\u0437 threadsafe-\u0441\u0442\u0435\u043a\u0430<\/li>\n<\/ul>\n<p>  <\/p>\n<h5>\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434<\/h5>\n<p>  \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 <a href=\"https:\/\/github.com\/blackmaster\/mysql2psql\">github<\/a>. \t\t\t \t\t\t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/175459\/\"> http:\/\/habrahabr.ru\/post\/175459\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\"> \t\t\t\u041f\u043e \u043c\u0435\u0440\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0430\u0437\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u043b\u0435\u043d\u0438\u044f \u0441 \u0438\u0445 \u043f\u043b\u044e\u0441\u0430\u043c\u0438 \u0438 \u043c\u0438\u043d\u0443\u0441\u0430\u043c\u0438, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0421\u0423\u0411\u0414 \u0432 \u0434\u0440\u0443\u0433\u0443\u044e. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441 MySQL \u043d\u0430 PostgreSQL. \u0412\u043e\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0432\u043a\u0443\u0441\u043d\u043e\u0441\u0442\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0436\u0434\u0443\u0442 \u043e\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043d\u0430 PostgreSQL, \u0432\u0435\u0440\u0441\u0438\u0438 9.2 (\u0441 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u043c \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u0441\u044f <a href=\"http:\/\/www.postgresql.org\/about\/featurematrix\/\">\u0442\u0443\u0442<\/a>):  <\/p>\n<ul>\n<li><a href=\"http:\/\/www.postgresql.org\/docs\/9.2\/static\/ddl-inherit.html\">\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446<\/a> (\u0435\u0441\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u0435\u0449\u0430\u044e\u0442 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c)<\/li>\n<li><a href=\"http:\/\/www.postgresql.org\/docs\/9.2\/static\/rangetypes.html\">\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u044b<\/a>: int4range, numrange, daterange<\/li>\n<li>\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f\u0437\u044b\u043a\u043e\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 (PL\/pgSQL, PL\/Tcl, PL\/Perl, PL\/Python \u0438 \u0433\u043e\u043b\u044b\u0439 C)<\/li>\n<li>\u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 <a href=\"http:\/\/www.postgresql.org\/docs\/9.2\/static\/queries-with.html\">WITH<\/a>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b<\/li>\n<li><i>(\u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f)<\/i> \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f (\u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u043e\u043d\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438 \u0441\u0435\u0439\u0447\u0430\u0441 \u2014 \u043a\u0430\u043a IUD \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u043a \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044e) <\/li>\n<li><i>(\u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f)<\/i> \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0430 \u043d\u0430 DDL \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438<\/li>\n<\/ul>\n<p>  \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u043f\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u043c SQL \u0434\u0430\u043c\u043f\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u043e\u043c \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0411\u0414. \u041d\u043e \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 (\u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u0435\u0441\u044f \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043e\u0431\u044a\u0435\u043c\u043e\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438) \u0442\u0430\u043a\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0435\u0441\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 SQL \u0434\u0430\u043c\u043f\u0430 \u0438\u0437 \u0421\u0423\u0411\u0414, \u0435\u0433\u043e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u0438 \u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u0434\u0430\u043c\u043f\u0430 \u0441\u043d\u043e\u0432\u0430 \u0432 \u0421\u0423\u0411\u0414. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 online-\u0432\u0430\u0440\u0438\u0430\u043d\u0442 (\u043f\u0440\u044f\u043c\u0438\u043a\u043e\u043c \u0438\u0437 \u0421\u0423\u0411\u0414 \u0432 \u0421\u0423\u0411\u0414) \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440\u0430, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-175459","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/175459","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=175459"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/175459\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=175459"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=175459"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=175459"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}