GnuCash c935c2f+
Loading...
Searching...
No Matches
Macros | Typedefs | Enumerations

Each price in the database represents an "instantaneous" quote for a given commodity with respect to another commodity. More...

Macros

#define PRICE_TYPE_LAST   "last"
 
#define PRICE_TYPE_UNK   "unknown"
 
#define PRICE_TYPE_TRN   "transaction"
 

Typedefs

typedef GList PriceList
 

Enumerations

enum  PriceSource {
  PRICE_SOURCE_EDIT_DLG , PRICE_SOURCE_FQ , PRICE_SOURCE_USER_PRICE , PRICE_SOURCE_XFER_DLG_VAL ,
  PRICE_SOURCE_SPLIT_REG , PRICE_SOURCE_SPLIT_IMPORT , PRICE_SOURCE_STOCK_SPLIT , PRICE_SOURCE_STOCK_TRANSACTION ,
  PRICE_SOURCE_INVOICE , PRICE_SOURCE_TEMP , PRICE_SOURCE_INVALID
}
 Price source enum. More...
 

Constructors

GNCPrice * gnc_price_create (QofBook *book)
 gnc_price_create - returns a newly allocated and initialized price with a reference count of 1.
 
GNCPrice * gnc_price_clone (GNCPrice *p, QofBook *book)
 gnc_price_clone - returns a newly allocated price that's a content-wise duplicate of the given price, p.
 
GNCPrice * gnc_price_invert (GNCPrice *p)
 Return a newly-allocated price that's the inverse of the given price, p.
 

Memory Management

void gnc_price_ref (GNCPrice *p)
 gnc_price_ref - indicate your need for a given price to stick around (i.e.
 
void gnc_price_unref (GNCPrice *p)
 gnc_price_unref - indicate you're finished with a price (i.e.
 

Setters

All of the setters store copies of the data given, with the exception of the commodity field which just stores the pointer given.

It is assumed that commodities are a global resource and are pointer unique.

Invocations of the setters should be wrapped with calls to gnc_price_begin_edit() and commit_edit(). The begin/commit calls help ensure that the local price db is synchronized with the backend.

void gnc_price_begin_edit (GNCPrice *p)
 
void gnc_price_commit_edit (GNCPrice *p)
 
void gnc_price_set_commodity (GNCPrice *p, gnc_commodity *c)
 
void gnc_price_set_currency (GNCPrice *p, gnc_commodity *c)
 
void gnc_price_set_time64 (GNCPrice *p, time64 t)
 
void gnc_price_set_source (GNCPrice *p, PriceSource source)
 
void gnc_price_set_source_string (GNCPrice *p, const char *s)
 
void gnc_price_set_typestr (GNCPrice *p, const char *type)
 
void gnc_price_set_value (GNCPrice *p, gnc_numeric value)
 

Getters

All of the getters return data that's internal to the GNCPrice, not copies, so don't free these values.

GNCPrice * gnc_price_lookup (const GncGUID *guid, QofBook *book)
 
gnc_commodity * gnc_price_get_commodity (const GNCPrice *p)
 
gnc_commodity * gnc_price_get_currency (const GNCPrice *p)
 
time64 gnc_price_get_time64 (const GNCPrice *p)
 
PriceSource gnc_price_get_source (const GNCPrice *p)
 
const char * gnc_price_get_source_string (const GNCPrice *p)
 
const char * gnc_price_get_typestr (const GNCPrice *p)
 
gnc_numeric gnc_price_get_value (const GNCPrice *p)
 
gboolean gnc_price_equal (const GNCPrice *p1, const GNCPrice *p2)
 
#define gnc_price_get_guid(X)   qof_entity_get_guid(QOF_INSTANCE(X))
 
#define gnc_price_return_guid(X)   (*(qof_entity_get_guid(QOF_INSTANCE(X))))
 
#define gnc_price_get_book(X)   qof_instance_get_book(QOF_INSTANCE(X))
 

Internal/Debugging

void gnc_price_print (GNCPrice *db, FILE *f, int indent)
 This simple function can be useful for debugging the price code.
 
void gnc_pricedb_print_contents (GNCPriceDB *db, FILE *f)
 This simple function can be useful for debugging the pricedb code.
 

GNCPrice lists

The database communicates multiple prices in and out via gnc price lists.

These are just time sorted GLists of GNCPrice pointers. Functions for manipulating these lists are provided. These functions are helpful in that they handle maintaining proper reference counts on behalf of the price list for every price being held in a given list. I.e. insert "refs" the prices being inserted, remove and destroy "unref" the prices that will no longer be referred to by the list.

gboolean gnc_price_list_insert (PriceList **prices, GNCPrice *p, gboolean check_dupl)
 gnc_price_list_insert - insert a price into the given list, calling gnc_price_ref on it during the process.
 
gboolean gnc_price_list_remove (PriceList **prices, GNCPrice *p)
 gnc_price_list_remove - remove the price, p, from the given list, calling gnc_price_unref on it during the process.
 
void gnc_price_list_destroy (PriceList *prices)
 gnc_price_list_destroy - destroy the given price list, calling gnc_price_unref on all the prices included in the list.
 
gboolean gnc_price_list_equal (PriceList *prices1, PriceList *prices2)
 

Denominator Constants Price policy: In order to avoid rounding

problems, currency prices (often called exchange rates) are saved in terms of the smaller currency, so that price > 1, with a fixed denominator of 1/1000.

Commodity prices in currency are always expressed as value per unit of the commodity with a fixed denominator of the pricing currency's SCU * 10000.

#define CURRENCY_DENOM   10000
 
#define COMMODITY_DENOM_MULT   10000
 

Detailed Description

Each price in the database represents an "instantaneous" quote for a given commodity with respect to another commodity.

For example, a given price might represent the value of LNUX in USD on 2001-02-03.

Fields:
Implementation Details:
Note
For source and type, NULL and the empty string are considered the same, so if one of these is "", then after a file save/restore, it might be NULL. Behave accordingly.

GNCPrices are reference counted. When you gnc_price_create one or clone it, the new price's count is set to 1. When you are finished with a price, call gnc_price_unref. If you hand the price pointer to some other code that needs to keep it, make sure it calls gnc_price_ref to indicate its interest in that price, and calls gnc_price_unref when it's finished with the price. For those unfamiliar with reference counting, basically each price stores an integer count which starts at 1 and is incremented every time someone calls gnc_price_ref. Conversely, the count is decremented every time someone calls gnc_price_unref. If the count ever reaches 0, the price is destroyed.

All of the getters return data that's internal to the GNCPrice, not copies, so don't free these values.

All of the setters store copies of the data given, with the exception of the commodity field which just stores the pointer given. It is assumed that commodities are a global resource and are pointer unique.

Macro Definition Documentation

◆ COMMODITY_DENOM_MULT

#define COMMODITY_DENOM_MULT   10000

Definition at line 286 of file gnc-pricedb.h.

◆ CURRENCY_DENOM

#define CURRENCY_DENOM   10000

Definition at line 285 of file gnc-pricedb.h.

◆ gnc_price_get_book

#define gnc_price_get_book (   X)    qof_instance_get_book(QOF_INSTANCE(X))

Definition at line 270 of file gnc-pricedb.h.

◆ gnc_price_get_guid

#define gnc_price_get_guid (   X)    qof_entity_get_guid(QOF_INSTANCE(X))

Definition at line 268 of file gnc-pricedb.h.

◆ gnc_price_return_guid

#define gnc_price_return_guid (   X)    (*(qof_entity_get_guid(QOF_INSTANCE(X))))

Definition at line 269 of file gnc-pricedb.h.

◆ PRICE_TYPE_LAST

#define PRICE_TYPE_LAST   "last"

Definition at line 184 of file gnc-pricedb.h.

◆ PRICE_TYPE_TRN

#define PRICE_TYPE_TRN   "transaction"

Definition at line 186 of file gnc-pricedb.h.

◆ PRICE_TYPE_UNK

#define PRICE_TYPE_UNK   "unknown"

Definition at line 185 of file gnc-pricedb.h.

Typedef Documentation

◆ PriceList

typedef GList PriceList

Definition at line 162 of file gnc-pricedb.h.

Enumeration Type Documentation

◆ PriceSource

Price source enum.

Be sure to keep in sync with the source_name array in gnc-pricedb.c. These are in preference order, so for example a quote with PRICE_SOURCE_EDIT_DLG will overwrite one with PRICE_SOURCE_FQ but not the other way around.

Definition at line 169 of file gnc-pricedb.h.

170{
171 PRICE_SOURCE_EDIT_DLG, // "user:price-editor"
172 PRICE_SOURCE_FQ, // "Finance::Quote"
173 PRICE_SOURCE_USER_PRICE, // "user:price"
174 PRICE_SOURCE_XFER_DLG_VAL, // "user:xfer-dialog"
175 PRICE_SOURCE_SPLIT_REG, // "user:split-register"
176 PRICE_SOURCE_SPLIT_IMPORT, // "user:split-import"
177 PRICE_SOURCE_STOCK_SPLIT, // "user:stock-split"
178 PRICE_SOURCE_STOCK_TRANSACTION,// "user:stock-transaction"
179 PRICE_SOURCE_INVOICE, // "user:invoice-post"
180 PRICE_SOURCE_TEMP, // "temporary"
181 PRICE_SOURCE_INVALID, // "invalid"
PriceSource
Price source enum.

Function Documentation

◆ gnc_price_begin_edit()

void gnc_price_begin_edit ( GNCPrice *  p)

Definition at line 411 of file gnc-pricedb.cpp.

412{
413 qof_begin_edit(&p->inst);
414}
gboolean qof_begin_edit(QofInstance *inst)
begin_edit

◆ gnc_price_clone()

GNCPrice * gnc_price_clone ( GNCPrice *  p,
QofBook book 
)

gnc_price_clone - returns a newly allocated price that's a content-wise duplicate of the given price, p.

The returned clone will have a reference count of 1.

Definition at line 354 of file gnc-pricedb.cpp.

355{
356 /* the clone doesn't belong to a PriceDB */
357 GNCPrice *new_p;
358
359 g_return_val_if_fail (book, nullptr);
360
361 ENTER ("pr=%p", p);
362
363 if (!p)
364 {
365 LEAVE ("return nullptr");
366 return nullptr;
367 }
368
369 new_p = gnc_price_create(book);
370 if (!new_p)
371 {
372 LEAVE ("return nullptr");
373 return nullptr;
374 }
375
376 qof_instance_copy_version(new_p, p);
377
378 gnc_price_begin_edit(new_p);
379 /* never ever clone guid's */
380 gnc_price_set_commodity(new_p, gnc_price_get_commodity(p));
381 gnc_price_set_time64(new_p, gnc_price_get_time64(p));
382 gnc_price_set_source(new_p, gnc_price_get_source(p));
383 gnc_price_set_typestr(new_p, gnc_price_get_typestr(p));
384 gnc_price_set_value(new_p, gnc_price_get_value(p));
385 gnc_price_set_currency(new_p, gnc_price_get_currency(p));
386 gnc_price_commit_edit(new_p);
387 LEAVE ("return cloned price %p", new_p);
388 return(new_p);
389}
#define LEAVE(format, args...)
Print a function exit debugging message.
Definition qoflog.h:282
#define ENTER(format, args...)
Print a function entry debugging message.
Definition qoflog.h:272
GNCPrice * gnc_price_create(QofBook *book)
gnc_price_create - returns a newly allocated and initialized price with a reference count of 1.

◆ gnc_price_commit_edit()

void gnc_price_commit_edit ( GNCPrice *  p)

Definition at line 425 of file gnc-pricedb.cpp.

426{
427 if (!qof_commit_edit (QOF_INSTANCE(p))) return;
428 qof_commit_edit_part2 (&p->inst, commit_err, noop, noop);
429}
gboolean qof_commit_edit_part2(QofInstance *inst, void(*on_error)(QofInstance *, QofBackendError), void(*on_done)(QofInstance *), void(*on_free)(QofInstance *))
part2 – deal with the backend
gboolean qof_commit_edit(QofInstance *inst)
commit_edit helpers

◆ gnc_price_create()

GNCPrice * gnc_price_create ( QofBook book)

gnc_price_create - returns a newly allocated and initialized price with a reference count of 1.

Definition at line 295 of file gnc-pricedb.cpp.

296{
297 GNCPrice *p;
298
299 g_return_val_if_fail (book, nullptr);
300
301 ENTER(" ");
302 p = static_cast<GNCPrice*>(g_object_new(GNC_TYPE_PRICE, nullptr));
303
304 qof_instance_init_data (&p->inst, GNC_ID_PRICE, book);
305 qof_event_gen (&p->inst, QOF_EVENT_CREATE, nullptr);
306 LEAVE ("price created %p", p);
307 return p;
308}
void qof_event_gen(QofInstance *entity, QofEventId event_id, gpointer event_data)
Invoke all registered event handlers using the given arguments.
Definition qofevent.cpp:231
void qof_instance_init_data(QofInstance *inst, QofIdType type, QofBook *book)
Initialise the settings associated with an instance.

◆ gnc_price_equal()

gboolean gnc_price_equal ( const GNCPrice *  p1,
const GNCPrice *  p2 
)

Definition at line 635 of file gnc-pricedb.cpp.

636{
637 time64 time1, time2;
638
639 if (p1 == p2) return TRUE;
640 if (!p1 || !p2) return FALSE;
641
642 if (!gnc_commodity_equiv (gnc_price_get_commodity (p1),
643 gnc_price_get_commodity (p2)))
644 return FALSE;
645
646 if (!gnc_commodity_equiv (gnc_price_get_currency (p1),
647 gnc_price_get_currency (p2)))
648 return FALSE;
649
650 time1 = gnc_price_get_time64 (p1);
651 time2 = gnc_price_get_time64 (p2);
652
653 if (time1 != time2)
654 return FALSE;
655
656 if (gnc_price_get_source (p1) != gnc_price_get_source (p2))
657 return FALSE;
658
659 if (g_strcmp0 (gnc_price_get_typestr (p1),
660 gnc_price_get_typestr (p2)) != 0)
661 return FALSE;
662
663 if (!gnc_numeric_eq (gnc_price_get_value (p1),
664 gnc_price_get_value (p2)))
665 return FALSE;
666
667 return TRUE;
668}
gboolean gnc_commodity_equiv(const gnc_commodity *a, const gnc_commodity *b)
This routine returns TRUE if the two commodities are equivalent.
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
Definition gnc-date.h:87
gboolean gnc_numeric_eq(gnc_numeric a, gnc_numeric b)
Equivalence predicate: Returns TRUE (1) if a and b are exactly the same (have the same numerator and ...

◆ gnc_price_get_commodity()

gnc_commodity * gnc_price_get_commodity ( const GNCPrice *  p)

Definition at line 583 of file gnc-pricedb.cpp.

584{
585 if (!p) return nullptr;
586 return p->commodity;
587}

◆ gnc_price_get_currency()

gnc_commodity * gnc_price_get_currency ( const GNCPrice *  p)

Definition at line 628 of file gnc-pricedb.cpp.

629{
630 if (!p) return nullptr;
631 return p->currency;
632}

◆ gnc_price_get_source()

PriceSource gnc_price_get_source ( const GNCPrice *  p)

Definition at line 596 of file gnc-pricedb.cpp.

597{
598 if (!p) return PRICE_SOURCE_INVALID;
599 return p->source;
600}

◆ gnc_price_get_source_string()

const char * gnc_price_get_source_string ( const GNCPrice *  p)

Definition at line 603 of file gnc-pricedb.cpp.

604{
605 if (!p) return nullptr;
606 return source_names[p->source];
607}

◆ gnc_price_get_time64()

time64 gnc_price_get_time64 ( const GNCPrice *  p)

Definition at line 590 of file gnc-pricedb.cpp.

591{
592 return p ? p->tmspec : 0;
593}

◆ gnc_price_get_typestr()

const char * gnc_price_get_typestr ( const GNCPrice *  p)

Definition at line 610 of file gnc-pricedb.cpp.

611{
612 if (!p) return nullptr;
613 return p->type;
614}

◆ gnc_price_get_value()

gnc_numeric gnc_price_get_value ( const GNCPrice *  p)

Definition at line 617 of file gnc-pricedb.cpp.

618{
619 if (!p)
620 {
621 PERR("price nullptr.\n");
622 return gnc_numeric_zero();
623 }
624 return p->value;
625}
#define PERR(format, args...)
Log a serious error.
Definition qoflog.h:244

◆ gnc_price_invert()

GNCPrice * gnc_price_invert ( GNCPrice *  p)

Return a newly-allocated price that's the inverse of the given price, p.

Inverse means that the commodity and currency are swapped and the value is the numeric inverse of the original's. The source is set to PRICE_SOURCE_TEMP to prevent it being saved in the pricedb.

Parameters
pThe price to invert
Returns
a new price, with a ref-count of 1. Don't forget to unref it!

Definition at line 392 of file gnc-pricedb.cpp.

393{
394 QofBook *book = qof_instance_get_book (QOF_INSTANCE(p));
395 GNCPrice *new_p = gnc_price_create (book);
396 qof_instance_copy_version(new_p, p);
397 gnc_price_begin_edit(new_p);
398 gnc_price_set_time64(new_p, gnc_price_get_time64(p));
399 gnc_price_set_source(new_p, PRICE_SOURCE_TEMP);
400 gnc_price_set_typestr(new_p, gnc_price_get_typestr(p));
401 gnc_price_set_commodity(new_p, gnc_price_get_currency(p));
402 gnc_price_set_currency(new_p, gnc_price_get_commodity(p));
403 gnc_price_set_value(new_p, gnc_numeric_invert(gnc_price_get_value(p)));
404 gnc_price_commit_edit(new_p);
405 return new_p;
406}
QofBook * qof_instance_get_book(gconstpointer inst)
Return the book pointer.
gnc_numeric gnc_numeric_invert(gnc_numeric num)
Invert a gnc_numeric.
QofBook reference.
Definition qofbook-p.hpp:47

◆ gnc_price_list_destroy()

void gnc_price_list_destroy ( PriceList *  prices)

gnc_price_list_destroy - destroy the given price list, calling gnc_price_unref on all the prices included in the list.

Definition at line 742 of file gnc-pricedb.cpp.

743{
744 g_list_free_full (prices, (GDestroyNotify)gnc_price_unref);
745}
void gnc_price_unref(GNCPrice *p)
gnc_price_unref - indicate you're finished with a price (i.e.

◆ gnc_price_list_equal()

gboolean gnc_price_list_equal ( PriceList *  prices1,
PriceList *  prices2 
)

Definition at line 748 of file gnc-pricedb.cpp.

749{
750 if (prices1 == prices2) return TRUE;
751
752 for (auto n1 = prices1, n2 = prices2; n1 || n2; n1 = g_list_next (n1), n2 = g_list_next (n2))
753 {
754 if (!n1)
755 {
756 PINFO ("prices2 has extra prices");
757 return FALSE;
758 }
759 if (!n2)
760 {
761 PINFO ("prices1 has extra prices");
762 return FALSE;
763 }
764 if (!gnc_price_equal (static_cast<GNCPrice*>(n1->data), static_cast<GNCPrice*>(n2->data)))
765 return FALSE;
766 };
767
768 return TRUE;
769}
#define PINFO(format, args...)
Print an informational note.
Definition qoflog.h:256

◆ gnc_price_list_insert()

gboolean gnc_price_list_insert ( PriceList **  prices,
GNCPrice *  p,
gboolean  check_dupl 
)

gnc_price_list_insert - insert a price into the given list, calling gnc_price_ref on it during the process.

Definition at line 706 of file gnc-pricedb.cpp.

707{
708 if (!prices || !p) return FALSE;
709 gnc_price_ref(p);
710
711 if (check_dupl && g_list_find_custom (*prices, p, (GCompareFunc)price_is_duplicate))
712 return true;
713
714 auto result_list = g_list_insert_sorted(*prices, p, compare_prices_by_date);
715 if (!result_list)
716 return false;
717
718 *prices = result_list;
719 return true;
720}
void gnc_price_ref(GNCPrice *p)
gnc_price_ref - indicate your need for a given price to stick around (i.e.

◆ gnc_price_list_remove()

gboolean gnc_price_list_remove ( PriceList **  prices,
GNCPrice *  p 
)

gnc_price_list_remove - remove the price, p, from the given list, calling gnc_price_unref on it during the process.

Definition at line 723 of file gnc-pricedb.cpp.

724{
725 GList *result_list;
726 GList *found_element;
727
728 if (!prices || !p) return FALSE;
729
730 found_element = g_list_find(*prices, p);
731 if (!found_element) return TRUE;
732
733 result_list = g_list_remove_link(*prices, found_element);
734 gnc_price_unref((GNCPrice *) found_element->data);
735 g_list_free(found_element);
736
737 *prices = result_list;
738 return TRUE;
739}

◆ gnc_price_lookup()

GNCPrice * gnc_price_lookup ( const GncGUID guid,
QofBook book 
)

Definition at line 573 of file gnc-pricedb.cpp.

574{
575 QofCollection *col;
576
577 if (!guid || !book) return nullptr;
578 col = qof_book_get_collection (book, GNC_ID_PRICE);
579 return (GNCPrice *) qof_collection_lookup_entity (col, guid);
580}
QofCollection * qof_book_get_collection(const QofBook *book, QofIdType entity_type)
Return The table of entities of the given type.
Definition qofbook.cpp:521
QofInstance * qof_collection_lookup_entity(const QofCollection *col, const GncGUID *guid)
Find the entity going only from its guid.
Definition qofid.cpp:209

◆ gnc_price_print()

void gnc_price_print ( GNCPrice *  db,
FILE *  f,
int  indent 
)

This simple function can be useful for debugging the price code.

Definition at line 2751 of file gnc-pricedb.cpp.

2752{
2753 gnc_commodity *commodity;
2754 gnc_commodity *currency;
2755 gchar *istr = nullptr; /* indent string */
2756 const char *str;
2757
2758 if (!p) return;
2759 if (!f) return;
2760
2761 commodity = gnc_price_get_commodity(p);
2762 currency = gnc_price_get_currency(p);
2763
2764 if (!commodity) return;
2765 if (!currency) return;
2766
2767 istr = g_strnfill(indent, ' ');
2768
2769 fprintf(f, "%s<pdb:price>\n", istr);
2770 fprintf(f, "%s <pdb:commodity pointer=%p>\n", istr, commodity);
2771 str = gnc_commodity_get_namespace(commodity);
2772 str = str ? str : "(null)";
2773 fprintf(f, "%s <cmdty:ref-space>%s</gnc:cmdty:ref-space>\n", istr, str);
2774 str = gnc_commodity_get_mnemonic(commodity);
2775 str = str ? str : "(null)";
2776 fprintf(f, "%s <cmdty:ref-id>%s</cmdty:ref-id>\n", istr, str);
2777 fprintf(f, "%s </pdb:commodity>\n", istr);
2778 fprintf(f, "%s <pdb:currency pointer=%p>\n", istr, currency);
2779 str = gnc_commodity_get_namespace(currency);
2780 str = str ? str : "(null)";
2781 fprintf(f, "%s <cmdty:ref-space>%s</gnc:cmdty:ref-space>\n", istr, str);
2782 str = gnc_commodity_get_mnemonic(currency);
2783 str = str ? str : "(null)";
2784 fprintf(f, "%s <cmdty:ref-id>%s</cmdty:ref-id>\n", istr, str);
2785 fprintf(f, "%s </pdb:currency>\n", istr);
2786 str = source_names[gnc_price_get_source(p)];
2787 str = str ? str : "invalid";
2788 fprintf(f, "%s %s\n", istr, str);
2789 str = gnc_price_get_typestr(p);
2790 str = str ? str : "(null)";
2791 fprintf(f, "%s %s\n", istr, str);
2792 fprintf(f, "%s %g\n", istr, gnc_numeric_to_double(gnc_price_get_value(p)));
2793 fprintf(f, "%s</pdb:price>\n", istr);
2794
2795 g_free(istr);
2796}
const char * gnc_commodity_get_namespace(const gnc_commodity *cm)
Retrieve the namespace for the specified commodity.
const char * gnc_commodity_get_mnemonic(const gnc_commodity *cm)
Retrieve the mnemonic for the specified commodity.
double gnc_numeric_to_double(gnc_numeric in)
Convert numeric to floating-point value.

◆ gnc_price_ref()

void gnc_price_ref ( GNCPrice *  p)

gnc_price_ref - indicate your need for a given price to stick around (i.e.

increase its reference count by 1).

Definition at line 324 of file gnc-pricedb.cpp.

325{
326 if (!p) return;
327 p->refcount++;
328}

◆ gnc_price_set_commodity()

void gnc_price_set_commodity ( GNCPrice *  p,
gnc_commodity *  c 
)

Definition at line 457 of file gnc-pricedb.cpp.

458{
459 if (!p) return;
460
461 if (!gnc_commodity_equiv(p->commodity, c))
462 {
463 /* Changing the commodity requires the hash table
464 * position to be modified. The easiest way of doing
465 * this is to remove and reinsert. */
466 gnc_price_ref (p);
467 remove_price (p->db, p, TRUE);
468 gnc_price_begin_edit (p);
469 p->commodity = c;
470 gnc_price_set_dirty(p);
471 gnc_price_commit_edit (p);
472 add_price (p->db, p);
473 gnc_price_unref (p);
474 }
475}

◆ gnc_price_set_currency()

void gnc_price_set_currency ( GNCPrice *  p,
gnc_commodity *  c 
)

Definition at line 479 of file gnc-pricedb.cpp.

480{
481 if (!p) return;
482
483 if (!gnc_commodity_equiv(p->currency, c))
484 {
485 /* Changing the currency requires the hash table
486 * position to be modified. The easiest way of doing
487 * this is to remove and reinsert. */
488 gnc_price_ref (p);
489 remove_price (p->db, p, TRUE);
490 gnc_price_begin_edit (p);
491 p->currency = c;
492 gnc_price_set_dirty(p);
493 gnc_price_commit_edit (p);
494 add_price (p->db, p);
495 gnc_price_unref (p);
496 }
497}

◆ gnc_price_set_source()

void gnc_price_set_source ( GNCPrice *  p,
PriceSource  source 
)

Definition at line 520 of file gnc-pricedb.cpp.

521{
522 if (!p) return;
523 gnc_price_begin_edit (p);
524 p->source = s;
525 gnc_price_set_dirty(p);
526 gnc_price_commit_edit(p);
527}

◆ gnc_price_set_source_string()

void gnc_price_set_source_string ( GNCPrice *  p,
const char *  s 
)

Definition at line 530 of file gnc-pricedb.cpp.

531{
532 if (!p) return;
533 for (PriceSource s = PRICE_SOURCE_EDIT_DLG;
534 s < PRICE_SOURCE_INVALID; s = PriceSource(s + 1))
535 if (strcmp(source_names[s], str) == 0)
536 {
537 gnc_price_set_source(p, s);
538 return;
539 }
540
541
542}

◆ gnc_price_set_time64()

void gnc_price_set_time64 ( GNCPrice *  p,
time64  t 
)

Definition at line 500 of file gnc-pricedb.cpp.

501{
502 if (!p) return;
503 if (p->tmspec != t)
504 {
505 /* Changing the datestamp requires the hash table
506 * position to be modified. The easiest way of doing
507 * this is to remove and reinsert. */
508 gnc_price_ref (p);
509 remove_price (p->db, p, FALSE);
510 gnc_price_begin_edit (p);
511 p->tmspec = t;
512 gnc_price_set_dirty(p);
513 gnc_price_commit_edit (p);
514 add_price (p->db, p);
515 gnc_price_unref (p);
516 }
517}

◆ gnc_price_set_typestr()

void gnc_price_set_typestr ( GNCPrice *  p,
const char *  type 
)

Definition at line 544 of file gnc-pricedb.cpp.

545{
546 if (!p) return;
547 if (g_strcmp0(p->type, type) != 0)
548 {
549 gnc_price_begin_edit (p);
550 CACHE_REPLACE(p->type, type);
551 gnc_price_set_dirty(p);
552 gnc_price_commit_edit (p);
553 }
554}

◆ gnc_price_set_value()

void gnc_price_set_value ( GNCPrice *  p,
gnc_numeric  value 
)

Definition at line 557 of file gnc-pricedb.cpp.

558{
559 if (!p) return;
560 if (!gnc_numeric_eq(p->value, value))
561 {
562 gnc_price_begin_edit (p);
563 p->value = value;
564 gnc_price_set_dirty(p);
565 gnc_price_commit_edit (p);
566 }
567}

◆ gnc_price_unref()

void gnc_price_unref ( GNCPrice *  p)

gnc_price_unref - indicate you're finished with a price (i.e.

decrease its reference count by 1).

Definition at line 331 of file gnc-pricedb.cpp.

332{
333 if (!p) return;
334 if (p->refcount == 0)
335 {
336 return;
337 }
338
339 p->refcount--;
340
341 if (p->refcount <= 0)
342 {
343 if (nullptr != p->db)
344 {
345 PERR("last unref while price in database");
346 }
347 gnc_price_destroy (p);
348 }
349}

◆ gnc_pricedb_print_contents()

void gnc_pricedb_print_contents ( GNCPriceDB *  db,
FILE *  f 
)

This simple function can be useful for debugging the pricedb code.

Definition at line 2807 of file gnc-pricedb.cpp.

2808{
2809 if (!db)
2810 {
2811 PERR("nullptr PriceDB\n");
2812 return;
2813 }
2814 if (!f)
2815 {
2816 PERR("nullptr FILE*\n");
2817 return;
2818 }
2819
2820 fprintf(f, "<gnc:pricedb>\n");
2821 gnc_pricedb_foreach_price(db, print_pricedb_adapter, f, FALSE);
2822 fprintf(f, "</gnc:pricedb>\n");
2823}
gboolean gnc_pricedb_foreach_price(GNCPriceDB *db, GncPriceForeachFunc f, gpointer user_data, gboolean stable_order)
Call a GncPriceForeachFunction once for each price in db, until the function returns FALSE.