00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "config.h"
00024
00025 #include <glib.h>
00026 #include <stdlib.h>
00027 #include <string.h>
00028
00029 #include <libpq-fe.h>
00030
00031 #include "qof.h"
00032 #include "book.h"
00033 #include "gnc-pricedb.h"
00034 #include "kvp-sql.h"
00035 #include "PostgresBackend.h"
00036
00037 #include "gnc-engine.h"
00038 #include "base-autogen.h"
00039
00040 #include "putil.h"
00041
00042 static QofLogModule log_module = GNC_MOD_BACKEND;
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 void
00069 pgendStoreBookNoLock (PGBackend *be, QofBook *book,
00070 gboolean do_check_version)
00071 {
00072 guint32 idata;
00073 if (!be || !book) return;
00074
00075 ENTER ("book=%p", book);
00076
00077 if (do_check_version)
00078 {
00079 if (0 < pgendBookCompareVersion (be, book)) return;
00080 }
00081 qof_book_set_version(book, (qof_book_get_version(book) +1));
00082
00083 if ((0 == qof_instance_get_idata(book)) &&
00084 (FALSE == kvp_frame_is_empty (qof_book_get_slots(book))))
00085 {
00086 qof_instance_set_idata(book, pgendNewGUIDidx(be));
00087 }
00088
00089 pgendPutOneBookOnly (be, book);
00090 idata = qof_instance_get_idata(book);
00091 if ( idata > 0)
00092 {
00093 pgendKVPDelete (be, idata);
00094 pgendKVPStore (be, idata, qof_instance_get_slots((QofInstance*)book));
00095 }
00096 LEAVE(" ");
00097 }
00098
00099 void
00100 pgendStoreBook (PGBackend *be, QofBook *book)
00101 {
00102 char *p;
00103 ENTER ("be=%p, book=%p", be, book);
00104 if (!be || !book) return;
00105
00106
00107 p = "BEGIN;\n"
00108 "LOCK TABLE gncBook IN EXCLUSIVE MODE;\n";
00109 SEND_QUERY (be,p, );
00110 FINISH_QUERY(be->connection);
00111
00112 pgendStoreBookNoLock (be, book, TRUE);
00113
00114 p = "COMMIT;\n"
00115 "NOTIFY gncBook;";
00116 SEND_QUERY (be,p, );
00117 FINISH_QUERY(be->connection);
00118 LEAVE(" ");
00119 }
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131 static gpointer
00132 get_one_book_cb (PGBackend *be, PGresult *result, int j, gpointer data)
00133 {
00134 QofBook *book = (QofBook *) data;
00135 GUID guid;
00136
00137
00138 PINFO ("book GUID=%s", DB_GET_VAL("bookGuid",j));
00139 guid = nullguid;
00140 string_to_guid (DB_GET_VAL("bookGuid",j), &guid);
00141
00142 qof_instance_set_guid (QOF_INSTANCE(book), &guid);
00143
00144 if((DB_GET_VAL("book_open",j))[0] == 'n')
00145 {
00146 qof_book_mark_closed(book);
00147 }
00148 qof_book_set_version(book, atoi(DB_GET_VAL("version",j)));
00149 qof_instance_set_idata(book, atoi(DB_GET_VAL("iguid",j)));
00150
00151 return book;
00152 }
00153
00154 static void pg_kvp_helper (const char* key, KvpValue *value, gpointer data)
00155 {
00156 QofBook *book = (QofBook*)data;
00157 kvp_frame_set_slot_nc(qof_instance_get_slots((QofInstance*)book),
00158 key, value);
00159 }
00160
00161 void
00162 pgendBookRestore (PGBackend *be, QofBook *book)
00163 {
00164 char * bufp;
00165
00166 ENTER ("be=%p", be);
00167 if (!be) return;
00168
00169
00170
00171
00172
00173 bufp = "SELECT * FROM gncBook WHERE book_open='y';";
00174 SEND_QUERY (be, bufp, );
00175 pgendGetResults (be, get_one_book_cb, book);
00176
00177 if (0 != qof_instance_get_idata(book))
00178 {
00179 KvpFrame *pg_frame;
00180
00181 pg_frame = pgendKVPFetch (be, qof_instance_get_idata(book),
00182 qof_instance_get_slots((QofInstance*)book));
00183 kvp_frame_for_each_slot(pg_frame, pg_kvp_helper, book);
00184 }
00185
00186 LEAVE (" ");
00187 }
00188
00189
00190
00191
00192
00193
00194 static gpointer
00195 get_book_cb (PGBackend *be, PGresult *result, int j, gpointer data)
00196 {
00197 QofBookList *blist = (QofBookList *) data;
00198 QofBookList *node;
00199 QofBook *book;
00200 GUID guid;
00201
00202 PINFO ("book GUID=%s", DB_GET_VAL("bookGUID",j));
00203 guid = nullguid;
00204 string_to_guid (DB_GET_VAL("bookGUID",j), &guid);
00205
00206
00207 book = NULL;
00208 for (node=blist; node; node=node->next)
00209 {
00210 book = node->data;
00211 if (guid_equal (qof_entity_get_guid(QOF_INSTANCE(book)), &guid)) break;
00212 book = NULL;
00213 }
00214
00215 if (!book)
00216 {
00217 book = qof_book_new();
00218 qof_instance_set_guid (QOF_INSTANCE(book), &guid);
00219 }
00220
00221 if((DB_GET_VAL("book_open",j))[0] == 'n')
00222 {
00223 qof_book_mark_closed(book);
00224 }
00225
00226 qof_book_set_version(book, atoi(DB_GET_VAL("version",j)));
00227 qof_instance_set_idata(book, atoi(DB_GET_VAL("iguid",j)));
00228
00229 return blist;
00230 }
00231
00232 QofBookList *
00233 pgendGetAllBooks (PGBackend *be, QofBookList *blist)
00234 {
00235 QofBookList *node;
00236 char * bufp;
00237
00238 ENTER ("be=%p", be);
00239 if (!be) return NULL;
00240
00241
00242 bufp = "SELECT * FROM gncBook;";
00243 SEND_QUERY (be, bufp, NULL);
00244 blist = pgendGetResults (be, get_book_cb, blist);
00245
00246
00247 for (node=blist; node; node=node->next)
00248 {
00249 QofBook *book = node->data;
00250 if (0 != qof_instance_get_idata(book))
00251 {
00252 KvpFrame *pg_frame;
00253
00254 pg_frame = pgendKVPFetch (be, qof_instance_get_idata(book),
00255 qof_instance_get_slots((QofInstance*)book));
00256 kvp_frame_for_each_slot(pg_frame, pg_kvp_helper, book);
00257 }
00258
00259
00260
00261
00262
00263 }
00264
00265 LEAVE (" ");
00266 return blist;
00267 }
00268
00269
00270
00271 void
00272 pgend_book_transfer_begin(QofBackend *bend, QofBook *newbook)
00273 {
00274 PGBackend *be = (PGBackend *) bend;
00275
00276 ENTER (" ");
00277
00278
00279 pgendStoreBook (be, newbook);
00280
00281 LEAVE (" ");
00282 }
00283
00284 void
00285 pgend_book_transfer_commit(QofBackend *bend, QofBook *newbook)
00286 {
00287
00288 ENTER (" ");
00289
00290 LEAVE (" ");
00291 }
00292
00293